package org.springframework.roo.classpath.antlrjavaparser;
import com.github.antlrjavaparser.JavaParser;
import com.github.antlrjavaparser.api.CompilationUnit;
import com.github.antlrjavaparser.api.body.TypeDeclaration;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.roo.classpath.TypeLocationService;
import org.springframework.roo.classpath.details.ClassOrInterfaceTypeDetails;
import org.springframework.roo.classpath.antlrjavaparser.details.JavaParserClassOrInterfaceTypeDetailsBuilder;
import org.springframework.roo.metadata.MetadataService;
import org.springframework.roo.model.JavaType;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.mockStatic;
import static org.powermock.api.mockito.PowerMockito.when;
/**
* Unit test of {@link JavaParserTypeParsingService}
*
* @author Andrew Swan
* @since 1.2.0
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({ JavaParserClassOrInterfaceTypeDetailsBuilder.class,
JavaParser.class, JavaParserUtils.class })
public class JavaParserTypeParsingServiceTest {
private static final String DECLARED_BY_MID = "MID:foo#bar";
private static final String EMPTY_FILE = "package com.example;";
private static final String SOURCE_FILE = "package com.example;" + ""
+ "public class MyClass {}" + "" + "class TargetClass {}" + ""
+ "class OtherClass {}";
@Mock private MetadataService mockMetadataService;
@Mock private TypeLocationService mockTypeLocationService;
// Fixture
private JavaParserTypeParsingService typeParsingService;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
typeParsingService = new JavaParserTypeParsingService();
typeParsingService.metadataService = mockMetadataService;
typeParsingService.typeLocationService = mockTypeLocationService;
}
@Test
public void testGetTypeFromStringWhenFileContainsNoSuchType() {
// Set up
final JavaType mockTargetType = mock(JavaType.class);
when(mockTargetType.getSimpleTypeName()).thenReturn("NoSuchType");
// Invoke
final ClassOrInterfaceTypeDetails locatedType = typeParsingService
.getTypeFromString(SOURCE_FILE, DECLARED_BY_MID, mockTargetType);
// Check
assertNull(locatedType);
}
@Test
public void testGetTypeFromStringWhenFileContainsNoTypes() {
// Set up
final JavaType mockTargetType = mock(JavaType.class);
// Invoke
final ClassOrInterfaceTypeDetails locatedType = typeParsingService
.getTypeFromString(EMPTY_FILE, DECLARED_BY_MID, mockTargetType);
// Check
assertNull(locatedType);
}
@Test
public void testGetTypeFromStringWhenFileContainsThatType()
throws Exception {
// Set up
final JavaType mockTargetType = mock(JavaType.class);
final TypeDeclaration mockTypeDeclaration = mock(TypeDeclaration.class);
final ClassOrInterfaceTypeDetails mockClassOrInterfaceTypeDetails = mock(ClassOrInterfaceTypeDetails.class);
final JavaParserClassOrInterfaceTypeDetailsBuilder mockBuilder = mock(JavaParserClassOrInterfaceTypeDetailsBuilder.class);
when(mockBuilder.build()).thenReturn(mockClassOrInterfaceTypeDetails);
mockStatic(JavaParserUtils.class);
when(
JavaParserUtils.locateTypeDeclaration(
any(CompilationUnit.class), eq(mockTargetType)))
.thenReturn(mockTypeDeclaration);
mockStatic(JavaParserClassOrInterfaceTypeDetailsBuilder.class);
when(
JavaParserClassOrInterfaceTypeDetailsBuilder.getInstance(
any(CompilationUnit.class),
(CompilationUnitServices) eq(null),
eq(mockTypeDeclaration), eq(DECLARED_BY_MID),
eq(mockTargetType), eq(mockMetadataService),
eq(mockTypeLocationService))).thenReturn(mockBuilder);
// Invoke
final ClassOrInterfaceTypeDetails locatedType = typeParsingService
.getTypeFromString(SOURCE_FILE, DECLARED_BY_MID, mockTargetType);
// Check
assertSame(mockClassOrInterfaceTypeDetails, locatedType);
}
}