package org.springframework.roo.classpath.details;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import org.junit.Before;
import org.junit.Test;
import org.springframework.roo.model.JavaType;
/**
* Unit test of {@link AbstractMemberHoldingTypeDetailsBuilder}
*
* @author Andrew Swan
* @since 1.2.0
*/
public class AbstractMemberHoldingTypeDetailsBuilderTest {
/**
* Testable subclass of {@link AbstractMemberHoldingTypeDetailsBuilder}, see
* http
* ://stackoverflow.com/questions/1087339/using-mockito-to-test-abstract-
* classes
*/
private static class TestableBuilder extends
AbstractMemberHoldingTypeDetailsBuilder<ClassOrInterfaceTypeDetails> {
/**
* Constructor
*/
protected TestableBuilder() {
super(DECLARED_BY_MID);
}
@Override
public void addImports(final Collection<ImportMetadata> imports) {}
public ClassOrInterfaceTypeDetails build() {
// This method can be spied upon, see the StackOverflow link above
return null;
}
}
private static final String DECLARED_BY_MID = "MID:foo#bar";
// Fixture
private AbstractMemberHoldingTypeDetailsBuilder<ClassOrInterfaceTypeDetails> builder;
@Before
public void setUp() {
builder = new TestableBuilder();
}
@Test
public void testAddConstructorAfterSettingUnmodifiableCollection() {
// Set up
final ConstructorMetadataBuilder mockConstructor1 = mock(ConstructorMetadataBuilder.class);
final ConstructorMetadataBuilder mockConstructor2 = mock(ConstructorMetadataBuilder.class);
when(mockConstructor2.getDeclaredByMetadataId()).thenReturn(DECLARED_BY_MID);
// Invoke
builder.setDeclaredConstructors(Collections.singleton(mockConstructor1));
final boolean added = builder.addConstructor(mockConstructor2);
// Check
assertTrue(added);
assertEquals(Arrays.asList(mockConstructor1, mockConstructor2),
builder.getDeclaredConstructors());
}
@Test
public void testAddExtendsTypeAfterSettingUnmodifiableCollection() {
// Set up
final JavaType mockType1 = mock(JavaType.class);
final JavaType mockType2 = mock(JavaType.class);
// Invoke
builder.setExtendsTypes(Collections.singleton(mockType1));
final boolean added = builder.addExtendsTypes(mockType2);
// Check
assertTrue(added);
assertEquals(Arrays.asList(mockType1, mockType2), builder.getExtendsTypes());
}
@Test
public void testAddFieldAfterSettingUnmodifiableCollection() {
// Set up
final FieldMetadataBuilder mockField1 = mock(FieldMetadataBuilder.class);
final FieldMetadataBuilder mockField2 = mock(FieldMetadataBuilder.class);
when(mockField2.getDeclaredByMetadataId()).thenReturn(DECLARED_BY_MID);
// Invoke
builder.setDeclaredFields(Collections.singleton(mockField1));
final boolean added = builder.addField(mockField2);
// Check
assertTrue(added);
assertEquals(Arrays.asList(mockField1, mockField2), builder.getDeclaredFields());
}
@Test
public void testAddImplementsTypeAfterSettingUnmodifiableCollection() {
// Set up
final JavaType mockType1 = mock(JavaType.class);
final JavaType mockType2 = mock(JavaType.class);
// Invoke
builder.setImplementsTypes(Collections.singleton(mockType1));
final boolean added = builder.addImplementsType(mockType2);
// Check
assertTrue(added);
assertEquals(Arrays.asList(mockType1, mockType2), builder.getImplementsTypes());
}
@Test
public void testAddInitializerAfterSettingUnmodifiableCollection() {
// Set up
final InitializerMetadataBuilder mockInitializer1 = mock(InitializerMetadataBuilder.class);
final InitializerMetadataBuilder mockInitializer2 = mock(InitializerMetadataBuilder.class);
when(mockInitializer2.getDeclaredByMetadataId()).thenReturn(DECLARED_BY_MID);
// Invoke
builder.setDeclaredInitializers(Collections.singleton(mockInitializer1));
final boolean added = builder.addInitializer(mockInitializer2);
// Check
assertTrue(added);
assertEquals(Arrays.asList(mockInitializer1, mockInitializer2),
builder.getDeclaredInitializers());
}
@Test
public void testAddInnerTypeAfterSettingUnmodifiableCollection() {
// Set up
final ClassOrInterfaceTypeDetailsBuilder mockInnerType1 =
mock(ClassOrInterfaceTypeDetailsBuilder.class);
final ClassOrInterfaceTypeDetailsBuilder mockInnerType2 =
mock(ClassOrInterfaceTypeDetailsBuilder.class);
// Invoke
builder.setDeclaredInnerTypes(Collections.singleton(mockInnerType1));
final boolean added = builder.addInnerType(mockInnerType2);
// Check
assertTrue(added);
assertEquals(Arrays.asList(mockInnerType1, mockInnerType2), builder.getDeclaredInnerTypes());
}
}