/* Copyright 2004-2005 the original author or authors.
*
* 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 org.grails.commons;
import grails.util.GrailsClassUtils;
import grails.util.GrailsNameUtils;
import junit.framework.TestCase;
import spock.lang.Issue;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
/**
* @author Graeme Rocher
*/
public class GrailsClassUtilsTests extends TestCase {
public void testFindPropertyNameForValue() {
TestBean testBean = new TestBean();
assertEquals("userName", GrailsClassUtils.findPropertyNameForValue(testBean, testBean.getUserName()));
assertEquals("welcomeMessage", GrailsClassUtils.findPropertyNameForValue(testBean, TestBean.getWelcomeMessage()));
}
public void testBooleanMatchesboolean() {
assertTrue(GrailsClassUtils.isMatchBetweenPrimativeAndWrapperTypes(Boolean.class, boolean.class));
}
public void testbooleanMatchesBoolean() {
assertTrue(GrailsClassUtils.isMatchBetweenPrimativeAndWrapperTypes(boolean.class, Boolean.class));
}
public void testIntegerMatchesint() {
assertTrue(GrailsClassUtils.isMatchBetweenPrimativeAndWrapperTypes(Integer.class, int.class));
}
public void testintMatchesInteger() {
assertTrue(GrailsClassUtils.isMatchBetweenPrimativeAndWrapperTypes(int.class, Integer.class));
}
public void testShortMatchesshort() {
assertTrue(GrailsClassUtils.isMatchBetweenPrimativeAndWrapperTypes(Short.class, short.class));
}
public void testshortMatchesShort() {
assertTrue(GrailsClassUtils.isMatchBetweenPrimativeAndWrapperTypes(short.class, Short.class));
}
public void testByteMatchesbyte() {
assertTrue(GrailsClassUtils.isMatchBetweenPrimativeAndWrapperTypes(Byte.class, byte.class));
}
public void testbyteMatchesByte() {
assertTrue(GrailsClassUtils.isMatchBetweenPrimativeAndWrapperTypes(byte.class, Byte.class));
}
public void testCharacterMatcheschar() {
assertTrue(GrailsClassUtils.isMatchBetweenPrimativeAndWrapperTypes(Character.class, char.class));
}
public void testcharMatchesCharacter() {
assertTrue(GrailsClassUtils.isMatchBetweenPrimativeAndWrapperTypes(char.class, Character.class));
}
public void testLongMatcheslong() {
assertTrue(GrailsClassUtils.isMatchBetweenPrimativeAndWrapperTypes(Long.class, long.class));
}
public void testlongMatchesLong() {
assertTrue(GrailsClassUtils.isMatchBetweenPrimativeAndWrapperTypes(long.class, Long.class));
}
public void testFloatMatchesfloat() {
assertTrue(GrailsClassUtils.isMatchBetweenPrimativeAndWrapperTypes(Float.class, float.class));
}
public void testfloatMatchesFloat() {
assertTrue(GrailsClassUtils.isMatchBetweenPrimativeAndWrapperTypes(float.class, Float.class));
}
public void testDoubleMatchesdouble() {
assertTrue(GrailsClassUtils.isMatchBetweenPrimativeAndWrapperTypes(Double.class, double.class));
}
public void testdoubleMatchesDouble() {
assertTrue(GrailsClassUtils.isMatchBetweenPrimativeAndWrapperTypes(double.class, Double.class));
}
public void testAssignableFromOrPrimitiveCompatible() {
assertTrue(GrailsClassUtils.isGroovyAssignableFrom(double.class, Double.class));
assertTrue(GrailsClassUtils.isGroovyAssignableFrom(Integer.class, int.class));
assertTrue(GrailsClassUtils.isGroovyAssignableFrom(TestCase.class, GrailsClassUtilsTests.class));
assertTrue(GrailsClassUtils.isGroovyAssignableFrom(Number.class, int.class));
}
public void testGetterNames() {
assertEquals("getConstraints", GrailsClassUtils.getGetterName("constraints"));
assertEquals("getURL", GrailsClassUtils.getGetterName("URL"));
assertEquals("getUrl", GrailsClassUtils.getGetterName("Url"));
}
public void testIsGetterOrSetter() {
assertTrue(GrailsClassUtils.isSetter("setSomething", new Class[] { String.class }));
assertTrue(GrailsNameUtils.isGetter("getSomething", new Class[0]));
assertTrue(GrailsNameUtils.isGetter("isSomething", new Class[0]));
assertTrue(GrailsClassUtils.isSetter("setURL", new Class[] { String.class }));
assertTrue(GrailsNameUtils.isGetter("getURL", new Class[0]));
assertTrue(GrailsNameUtils.isGetter("isURL", new Class[0]));
assertTrue(GrailsClassUtils.isSetter("setaProp", new Class[] { String.class }));
assertTrue(GrailsNameUtils.isGetter("getaProp", new Class[0]));
assertTrue(GrailsNameUtils.isGetter("isaProp", new Class[0]));
assertTrue(GrailsClassUtils.isSetter("setX", new Class[] { String.class }));
assertTrue(GrailsNameUtils.isGetter("getX", new Class[0]));
assertTrue(GrailsNameUtils.isGetter("isX", new Class[0]));
assertTrue(GrailsClassUtils.isSetter("setX2", new Class[] { String.class }));
assertTrue(GrailsNameUtils.isGetter("getX2", new Class[0]));
assertTrue(GrailsNameUtils.isGetter("isX2", new Class[0]));
assertFalse(GrailsNameUtils.isGetter("something", new Class[] { String.class }));
assertFalse(GrailsNameUtils.isGetter("get", new Class[0]));
assertFalse(GrailsClassUtils.isSetter("set", new Class[] { String.class }));
assertFalse(GrailsNameUtils.isGetter("somethingElse", new Class[0]));
assertFalse(GrailsClassUtils.isSetter("setSomething", new Class[] { String.class, Object.class }));
assertFalse(GrailsNameUtils.isGetter("getSomething", new Class[] { Object.class }));
assertFalse(GrailsNameUtils.isGetter("getsomething", new Class[0]));
assertFalse(GrailsNameUtils.isGetter("issomething", new Class[0]));
assertFalse(GrailsClassUtils.isSetter("setsomething", new Class[] { String.class }));
assertFalse(GrailsNameUtils.isGetter("get0", new Class[0]));
assertFalse(GrailsClassUtils.isSetter("set0", new Class[] { String.class }));
assertFalse(GrailsNameUtils.isGetter("get2other", new Class[0]));
assertFalse(GrailsClassUtils.isSetter("set2other", new Class[] { String.class }));
assertFalse(GrailsNameUtils.isGetter("getq3", new Class[0]));
assertFalse(GrailsClassUtils.isSetter("setq3", new Class[] { String.class }));
assertFalse(GrailsNameUtils.isGetter("get5A", new Class[0]));
assertFalse(GrailsClassUtils.isSetter("set5A", new Class[] { String.class }));
assertFalse(GrailsNameUtils.isGetter("", new Class[0]));
assertFalse(GrailsClassUtils.isSetter("", new Class[] { String.class }));
assertFalse(GrailsNameUtils.isGetter(null, new Class[] { Object.class }));
assertFalse(GrailsNameUtils.isGetter("getSomething", null));
assertFalse(GrailsNameUtils.isGetter(null, null));
}
public void testGetPropertyForGetter() {
assertEquals("something", GrailsNameUtils.getPropertyForGetter("getSomething"));
assertEquals("URL", GrailsNameUtils.getPropertyForGetter("getURL"));
assertEquals("p", GrailsNameUtils.getPropertyForGetter("getP"));
assertEquals("URL", GrailsNameUtils.getPropertyForGetter("isURL"));
assertEquals("aProp", GrailsNameUtils.getPropertyForGetter("getaProp"));
assertEquals("x2", GrailsNameUtils.getPropertyForGetter("getX2"));
assertEquals("x2", GrailsNameUtils.getPropertyForGetter("isX2"));
assertEquals("_someProperty", GrailsClassUtils.getPropertyForGetter("get_someProperty", String.class));
assertNull(GrailsNameUtils.getPropertyForGetter(null));
assertNull(GrailsNameUtils.getPropertyForGetter(""));
assertNull(GrailsNameUtils.getPropertyForGetter("get0"));
assertNull(GrailsNameUtils.getPropertyForGetter("get2other"));
assertNull(GrailsNameUtils.getPropertyForGetter("getq3"));
assertNull(GrailsNameUtils.getPropertyForGetter("get5A"));
assertNull(GrailsNameUtils.getPropertyForGetter("setSomething"));
assertNull(GrailsNameUtils.getPropertyForGetter("getit"));
assertNull(GrailsNameUtils.getPropertyForGetter("geta"));
assertNull(GrailsNameUtils.getPropertyForGetter("get0"));
}
public void testGetStaticField() {
assertEquals("SomeFieldValue",
GrailsClassUtils.getStaticFieldValue(ClassWithStaticFieldAndStaticPropertyWithSameName.class, "name"));
assertEquals("SomePropertyValue",
GrailsClassUtils.getStaticPropertyValue(ClassWithStaticFieldAndStaticPropertyWithSameName.class, "name"));
}
public void testGetStaticProperty() {
assertEquals(HttpServletRequest.BASIC_AUTH,
GrailsClassUtils.getStaticPropertyValue(HttpServletRequest.class, "BASIC_AUTH"));
assertEquals("hello", GrailsClassUtils.getStaticPropertyValue(TestBean.class, "welcomeMessage"));
}
public void testIsPublicStatic() throws Exception {
assertTrue(GrailsClassUtils.isPublicStatic(HttpServletRequest.class.getDeclaredField("BASIC_AUTH")));
assertFalse(GrailsClassUtils.isPublicStatic(String.class.getDeclaredField("serialVersionUID")));
assertFalse(GrailsClassUtils.isPublicStatic(TestBean.class.getDeclaredField("welcomeMessage")));
}
public void testGetPropertyOrStatic() {
TestBean bean = new TestBean();
assertEquals("hello", GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(bean, "welcomeMessage"));
assertEquals("marc", GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(bean, "userName"));
assertEquals("indian", GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(bean, "favouriteFood"));
assertEquals("Cardiacs", GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(bean, "favouriteArtist"));
}
public void testGetFieldValue() {
TestBean bean = new TestBean();
assertTrue(GrailsClassUtils.isPublicField(bean, "favouriteArtist"));
assertEquals("Cardiacs", GrailsClassUtils.getFieldValue(bean, "favouriteArtist"));
}
public void testIsAssignableOrConvertibleFrom() {
// test number
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Number.class, int.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Number.class, Integer.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Number.class, short.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Number.class, Short.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Number.class, byte.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Number.class, Byte.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Number.class, long.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Number.class, Long.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Number.class, float.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Number.class, Float.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Number.class, double.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Number.class, Double.class));
// test integer
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Integer.class, int.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Integer.class, Integer.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Integer.class, short.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Integer.class, Short.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Integer.class, byte.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Integer.class, Byte.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Integer.class, long.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Integer.class, Long.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Integer.class, float.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Integer.class, Float.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Integer.class, double.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Integer.class, Double.class));
// test short
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Short.class, int.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Short.class, Integer.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Short.class, short.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Short.class, Short.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Short.class, byte.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Short.class, Byte.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Short.class, long.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Short.class, Long.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Short.class, float.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Short.class, Float.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Short.class, double.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Short.class, Double.class));
// test byte
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Byte.class, int.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Byte.class, Integer.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Byte.class, short.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Byte.class, Short.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Byte.class, byte.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Byte.class, Byte.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Byte.class, long.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Byte.class, Long.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Byte.class, float.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Byte.class, Float.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Byte.class, double.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Byte.class, Double.class));
// test long
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Long.class, int.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Long.class, Integer.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Long.class, short.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Long.class, Short.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Long.class, byte.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Long.class, Byte.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Long.class, long.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Long.class, Long.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Long.class, float.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Long.class, Float.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Long.class, double.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Long.class, Double.class));
// test float
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Float.class, int.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Float.class, Integer.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Float.class, short.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Float.class, Short.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Float.class, byte.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Float.class, Byte.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Float.class, long.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Float.class, Long.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Float.class, float.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Float.class, Float.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Float.class, double.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Float.class, Double.class));
// test double
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Double.class, int.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Double.class, Integer.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Double.class, short.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Double.class, Short.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Double.class, byte.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Double.class, Byte.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Double.class, long.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Double.class, Long.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Double.class, float.class));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Double.class, Float.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Double.class, double.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Double.class, Double.class));
// test boolean
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Boolean.class, boolean.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Boolean.class, Boolean.class));
// test character
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Character.class, char.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Character.class, Character.class));
// test object
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Object.class, int.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Object.class, Integer.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Object.class, short.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Object.class, Short.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Object.class, byte.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Object.class, Byte.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Object.class, long.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Object.class, Long.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Object.class, float.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Object.class, Float.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Object.class, double.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Object.class, Double.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Object.class, boolean.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Object.class, Boolean.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Object.class, char.class));
assertTrue(GrailsClassUtils.isAssignableOrConvertibleFrom(Object.class, Character.class));
// test null
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(null, null));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(Integer.class, null));
assertFalse(GrailsClassUtils.isAssignableOrConvertibleFrom(null, int.class));
}
public void testIsPropertyGetter() throws Exception {
assertTrue(GrailsClassUtils.isPropertyGetter(ClassHavingPropertyGetters.class.getDeclaredMethod("getName", null)));
assertFalse(GrailsClassUtils.isPropertyGetter(ClassHavingPropertyGetters.class.getDeclaredMethod("setName", null)));
assertFalse(GrailsClassUtils.isPropertyGetter(ClassHavingPropertyGetters.class.getDeclaredMethod("getSurname", null)));
assertFalse(GrailsClassUtils.isPropertyGetter(ClassHavingPropertyGetters.class.getDeclaredMethod("getNewYear", null)));
assertFalse(GrailsClassUtils.isPropertyGetter(ClassHavingPropertyGetters.class.getDeclaredMethod("getFilename", String.class)));
assertFalse(GrailsClassUtils.isPropertyGetter(ClassHavingPropertyGetters.class.getDeclaredMethod("getTitle", null)));
}
@Issue("https://github.com/grails/grails-core/issues/10343")
public void testPropertiesBeginningWithSingleLowerCaseLetter() throws Exception {
assertTrue(GrailsClassUtils.isPropertyGetter(SomeGroovyClass.class.getDeclaredMethod("getaString", null)));
assertTrue(GrailsClassUtils.isPropertyGetter(SomeGroovyClass.class.getDeclaredMethod("isaBoolean", null)));
assertTrue(GrailsClassUtils.isPropertyGetter(SomeGroovyClass.class.getDeclaredMethod("getS", null)));
assertTrue(GrailsClassUtils.isPropertyGetter(SomeGroovyClass.class.getDeclaredMethod("isB", null)));
}
}
class ClassWithStaticFieldAndStaticPropertyWithSameName {
public static String name = "SomeFieldValue";
public static String getName() {
return "SomePropertyValue";
}
}
class ClassHavingPropertyGetters {
public String getName() { return ""; }
public void setName() { }
protected String getSurname() { return ""; }
private Date getNewYear() { return null; }
public String getFilename(String prefix) { return ""; }
public static String getTitle() { return ""; }
}