package org.springframework.roo.converters;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import static org.springframework.roo.project.LogicalPath.MODULE_PATH_SEPARATOR;
import static org.springframework.roo.support.util.AnsiEscapeCode.FG_CYAN;
import static org.springframework.roo.support.util.AnsiEscapeCode.decorate;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.roo.classpath.TypeLocationService;
import org.springframework.roo.model.JavaType;
import org.springframework.roo.process.manager.FileManager;
import org.springframework.roo.project.ProjectOperations;
import org.springframework.roo.project.maven.Pom;
import org.springframework.roo.shell.Completion;
import org.springframework.roo.shell.OptionContexts;
import org.springframework.roo.support.util.AnsiEscapeCode;
/**
* Unit test of {@link JavaTypeConverter}
*
* @author Andrew Swan
* @since 1.2.0
*/
public class JavaTypeConverterTest {
// Fixture
private JavaTypeConverter converter;
@Mock
FileManager mockFileManager;
@Mock
LastUsed mockLastUsed;
@Mock
ProjectOperations mockProjectOperations;
@Mock
TypeLocationService mockTypeLocationService;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
converter = new JavaTypeConverter();
converter.fileManager = mockFileManager;
converter.lastUsed = mockLastUsed;
converter.projectOperations = mockProjectOperations;
converter.typeLocationService = mockTypeLocationService;
}
@Test
public void testConvertAsteriskWhenLastUsedTypeIsKnown() {
// Set up
final JavaType mockLastUsedType = mock(JavaType.class);
when(mockLastUsed.getJavaType()).thenReturn(mockLastUsedType);
// Invoke and check
assertEquals(mockLastUsedType,
converter.convertFromText(JavaTypeConverter.LAST_USED_INDICATOR, null, null));
}
@Test(expected = IllegalStateException.class)
public void testConvertAsteriskWhenLastUsedTypeIsUnknown() {
converter.convertFromText(JavaTypeConverter.LAST_USED_INDICATOR, null, null);
}
@Test
public void testConvertEmptyString() {
assertNull(converter.convertFromText("", null, null));
}
@Test
public void testConvertFullyQualifiedValueWithOneModulePrefix() {
// Set up
final String moduleName = "web";
final Pom mockWebPom = mock(Pom.class);
when(mockProjectOperations.getPomFromModuleName(moduleName)).thenReturn(mockWebPom);
final String topLevelPackage = "com.example.app.mvc";
when(mockTypeLocationService.getTopLevelPackageForModule(mockWebPom)).thenReturn(
topLevelPackage);
// Invoke
final JavaType result =
converter.convertFromText(moduleName + MODULE_PATH_SEPARATOR + topLevelPackage
+ ".pet.PetController", null, null);
// Check
assertEquals("com.example.app.mvc.pet.PetController", result.getFullyQualifiedTypeName());
}
@Test
public void testConvertNullString() {
assertNull(converter.convertFromText(null, null, null));
}
@Test
public void testConvertTopLevelPackageWithOneModulePrefix() {
// Set up
final String moduleName = "web";
final Pom mockWebPom = mock(Pom.class);
when(mockProjectOperations.getPomFromModuleName(moduleName)).thenReturn(mockWebPom);
final String topLevelPackage = "com.example.app.mvc";
when(mockTypeLocationService.getTopLevelPackageForModule(mockWebPom)).thenReturn(
topLevelPackage);
// Invoke
final JavaType result =
converter.convertFromText(moduleName + MODULE_PATH_SEPARATOR + topLevelPackage, null, null);
// Check
assertNull(result);
}
@Test
public void testConvertToPrimitiveByte() {
assertEquals(JavaType.BYTE_PRIMITIVE, converter.convertFromText("byte", null, null));
}
@Test
public void testConvertToPrimitiveDouble() {
assertEquals(JavaType.DOUBLE_PRIMITIVE, converter.convertFromText("double", null, null));
}
@Test
public void testConvertToPrimitiveFloat() {
assertEquals(JavaType.FLOAT_PRIMITIVE, converter.convertFromText("float", null, null));
}
@Test
public void testConvertToPrimitiveInt() {
assertEquals(JavaType.INT_PRIMITIVE, converter.convertFromText("int", null, null));
}
@Test
public void testConvertToPrimitiveLong() {
assertEquals(JavaType.LONG_PRIMITIVE, converter.convertFromText("long", null, null));
}
@Test
public void testConvertToPrimitiveShort() {
assertEquals(JavaType.SHORT_PRIMITIVE, converter.convertFromText("short", null, null));
}
@Test
public void testConvertWhitespace() {
assertNull(converter.convertFromText(" \n\r\t", null, null));
}
@Test
public void testGetAllPossibleValuesInProjectWhenModulePrefixIsUsed() {
// Set up
@SuppressWarnings("unchecked")
final List<Completion> mockCompletions = mock(List.class);
when(mockProjectOperations.isFocusedProjectAvailable()).thenReturn(true);
final String otherModuleName = "core";
final Pom mockOtherModule = mock(Pom.class);
when(mockOtherModule.getModuleName()).thenReturn(otherModuleName);
when(mockProjectOperations.getPomFromModuleName(otherModuleName)).thenReturn(mockOtherModule);
final String topLevelPackage = "com.example";
when(mockTypeLocationService.getTopLevelPackageForModule(mockOtherModule)).thenReturn(
topLevelPackage);
final String focusedModuleName = "web";
when(mockProjectOperations.getModuleNames()).thenReturn(
Arrays.asList(focusedModuleName, otherModuleName));
final String modulePath = "/path/to/it";
when(mockOtherModule.getPath()).thenReturn(modulePath);
final JavaType type1 = new JavaType("com.example.web.ShouldBeFound");
final JavaType type2 = new JavaType("com.example.foo.ShouldNotBeFound");
when(mockTypeLocationService.getTypesForModule(mockOtherModule)).thenReturn(
Arrays.asList(type1, type2));
// Invoke
converter.getAllPossibleValues(mockCompletions, JavaType.class, otherModuleName
+ MODULE_PATH_SEPARATOR + "~.web", OptionContexts.PROJECT, null);
// Check
verify(mockCompletions).add(
new Completion(focusedModuleName + MODULE_PATH_SEPARATOR, AnsiEscapeCode.decorate(
focusedModuleName + MODULE_PATH_SEPARATOR, AnsiEscapeCode.FG_CYAN), "Modules", 0));
// prefix + topLevelPackage, formattedPrefix + topLevelPackage, heading
final String formattedPrefix = decorate(otherModuleName + MODULE_PATH_SEPARATOR, FG_CYAN);
final String prefix = otherModuleName + MODULE_PATH_SEPARATOR;
verify(mockCompletions).add(
new Completion(prefix + topLevelPackage, formattedPrefix + topLevelPackage, "", 1));
verify(mockCompletions).add(
new Completion(prefix + "~.web.ShouldBeFound", formattedPrefix + "~.web.ShouldBeFound", "",
1));
verifyNoMoreInteractions(mockCompletions);
}
@Test
public void testGetAllPossibleValuesInProjectWhenNoModuleHasFocus() {
// Set up
@SuppressWarnings("unchecked")
final List<Completion> mockCompletions = mock(List.class);
// Invoke
converter.getAllPossibleValues(mockCompletions, JavaType.class, "", OptionContexts.PROJECT,
null);
// Check
verifyNoMoreInteractions(mockCompletions);
}
@Test
public void testGetAllPossibleValuesInProjectWhenNoModulePrefixIsUsed() {
// Set up
@SuppressWarnings("unchecked")
final List<Completion> mockCompletions = mock(List.class);
when(mockProjectOperations.isFocusedProjectAvailable()).thenReturn(true);
final Pom mockFocusedModule = mock(Pom.class);
when(mockProjectOperations.getFocusedModule()).thenReturn(mockFocusedModule);
final String topLevelPackage = "com.example";
when(mockTypeLocationService.getTopLevelPackageForModule(mockFocusedModule)).thenReturn(
topLevelPackage);
final String focusedModuleName = "web";
when(mockFocusedModule.getModuleName()).thenReturn(focusedModuleName);
final String modulePath = "/path/to/it";
when(mockFocusedModule.getPath()).thenReturn(modulePath);
final String otherModuleName = "core";
when(mockProjectOperations.getModuleNames()).thenReturn(
Arrays.asList(focusedModuleName, otherModuleName));
final JavaType type1 = new JavaType("com.example.Foo");
final JavaType type2 = new JavaType("com.example.sub.Bar");
when(mockTypeLocationService.getTypesForModule(mockFocusedModule)).thenReturn(
Arrays.asList(type1, type2));
// Invoke
converter.getAllPossibleValues(mockCompletions, JavaType.class, "", OptionContexts.PROJECT,
null);
// Check
verify(mockCompletions).add(
new Completion(otherModuleName + MODULE_PATH_SEPARATOR, AnsiEscapeCode.decorate(
otherModuleName + MODULE_PATH_SEPARATOR, AnsiEscapeCode.FG_CYAN), "Modules", 0));
verify(mockCompletions).add(
new Completion(topLevelPackage, topLevelPackage, focusedModuleName, 1));
verify(mockCompletions).add(new Completion("~.Foo", "~.Foo", focusedModuleName, 1));
verify(mockCompletions).add(new Completion("~.sub.Bar", "~.sub.Bar", focusedModuleName, 1));
verifyNoMoreInteractions(mockCompletions);
}
@Test
public void testSupportsJavaType() {
assertTrue(converter.supports(JavaType.class, null));
}
}