/*******************************************************************************
* Copyright (c) 2015 Pivotal, Inc.
* 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:
* Pivotal, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.boot.properties.editor.test;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.springframework.ide.eclipse.boot.properties.editor.util.Type;
import org.springframework.ide.eclipse.boot.properties.editor.util.TypeParser;
import org.springframework.ide.eclipse.boot.properties.editor.util.TypedProperty;
import org.springframework.ide.eclipse.boot.properties.editor.util.TypeUtil.BeanPropertyNameMode;
import org.springframework.ide.eclipse.boot.properties.editor.util.TypeUtil.EnumCaseMode;
import static org.springsource.ide.eclipse.commons.tests.util.StsTestCase.assertElements;
/**
* @author Kris De Volder
*/
public class TypeUtilTests extends SpringPropertiesEditorTestHarness {
private Type getPropertyType(Type type, String propName, EnumCaseMode enumMode, BeanPropertyNameMode beanMode) {
List<TypedProperty> props = getProperties(type, enumMode, beanMode);
for (TypedProperty prop : props) {
if (prop.getName().equals(propName)) {
return prop.getType();
}
}
return null;
}
private List<TypedProperty> getProperties(Type type, EnumCaseMode enumMode, BeanPropertyNameMode beanMode) {
return engine.getTypeUtil().getProperties(type, enumMode, beanMode);
}
public void testGetTrickyProperties() throws Exception {
IProject p = createPredefinedMavenProject("demo");
useProject(p);
List<TypedProperty> props = getProperties(TypeParser.parse("demo.TrickyGetters"), EnumCaseMode.LOWER_CASE, BeanPropertyNameMode.HYPHENATED);
String[] actualNames = new String[props.size()];
for (int i = 0; i < actualNames.length; i++) {
actualNames[i] = props.get(i).getName();
}
assertElements(actualNames, "public-property"); //static and private properties should not be included.
}
public void testGetProperties() throws Exception {
IProject p = createPredefinedMavenProject("demo-enum");
IJavaProject jp = JavaCore.create(p);
useProject(jp);
assertNotNull(jp.findType("demo.Color"));
assertNotNull(jp.findType("demo.ColorData"));
Type data = TypeParser.parse("demo.ColorData");
assertType("java.lang.Double",
getPropertyType(data, "wavelen"));
assertType("java.lang.String",
getPropertyType(data, "name"));
assertType("demo.Color",
getPropertyType(data, "next"));
assertType("demo.ColorData",
getPropertyType(data, "nested"));
assertType("java.util.List<java.lang.String>",
getPropertyType(data, "tags"));
assertType("java.util.Map<java.lang.String,demo.ColorData>",
getPropertyType(data, "mapped-children"));
assertType("java.util.Map<demo.Color,demo.ColorData>",
getPropertyType(data, "color-children"));
//Also gets aliased as camelCased names?
assertType("java.util.Map<demo.Color,demo.ColorData>",
getPropertyType(data, "colorChildren"));
assertType("java.util.Map<java.lang.String,demo.ColorData>",
getPropertyType(data, "mappedChildren"));
//Gets aliased names only if asked for it?
assertType("java.util.Map<java.lang.String,demo.ColorData>",
getPropertyType(data, "mappedChildren", EnumCaseMode.ORIGNAL, BeanPropertyNameMode.CAMEL_CASE));
assertType(null,
getPropertyType(data, "mappedChildren", EnumCaseMode.ORIGNAL, BeanPropertyNameMode.HYPHENATED));
assertType(null,
getPropertyType(data, "mapped-children", EnumCaseMode.ORIGNAL, BeanPropertyNameMode.CAMEL_CASE));
assertType("java.util.Map<java.lang.String,demo.ColorData>",
getPropertyType(data, "mapped-children", EnumCaseMode.ORIGNAL, BeanPropertyNameMode.HYPHENATED));
}
public void testGetEnumKeyedProperties() throws Exception {
IProject p = createPredefinedMavenProject("demo-enum");
IJavaProject jp = JavaCore.create(p);
useProject(jp);
Type data = TypeParser.parse("java.util.Map<demo.Color,Something>");
assertType("Something", getPropertyType(data, "red"));
assertType("Something", getPropertyType(data, "green"));
assertType("Something", getPropertyType(data, "blue"));
assertType("Something", getPropertyType(data, "RED"));
assertType("Something", getPropertyType(data, "GREEN"));
assertType("Something", getPropertyType(data, "BLUE"));
assertNull(getPropertyType(data, "not-a-color"));
}
private Type getPropertyType(Type type, String propName) {
return getPropertyType(type, propName, EnumCaseMode.ALIASED, BeanPropertyNameMode.ALIASED);
}
private void assertType(String expectedType, Type actualType) {
assertEquals(TypeParser.parse(expectedType), actualType);
}
public void testTypeFromSignature() throws Exception {
IProject p = createPredefinedMavenProject("demo-enum");
IJavaProject jp = JavaCore.create(p);
useProject(jp);
assertType("java.lang.String", Type.fromSignature("QString;", jp.findType("demo.ColorData")));
assertType("java.lang.String", Type.fromSignature("Ljava.lang.String;", jp.findType("demo.ColorData")));
assertType("java.lang.String[]", Type.fromSignature("[Ljava.lang.String;", jp.findType("demo.ColorData")));
assertType("java.lang.String[]", Type.fromSignature("[QString;", jp.findType("demo.ColorData")));
}
}