package org.springframework.roo.converters;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
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.model.JavaType;
import org.springframework.roo.project.packaging.CorePackagingProvider;
import org.springframework.roo.project.packaging.PackagingProvider;
import org.springframework.roo.project.packaging.PackagingProviderRegistry;
import org.springframework.roo.shell.Completion;
/**
* Unit test of {@link PackagingProviderConverter}
*
* @author Andrew Swan
* @since 1.2.0
*/
public class PackagingProviderConverterTest {
private static final String CORE_JAR_ID = "jar";
private static final String CORE_WAR_ID = "war";
private static final String CUSTOM_JAR_ID = "jar_custom";
// Fixture
private PackagingProviderConverter converter;
@Mock
private CorePackagingProvider mockCoreJarPackaging;
@Mock
private PackagingProvider mockCustomJarPackaging;
@Mock
private PackagingProviderRegistry mockPackagingProviderRegistry;
@Mock
private CorePackagingProvider mockWarPackaging;
/**
* Asserts that the given string can't be converted to a
* {@link PackagingProvider}
*
* @param string the string to convert (can be blank)
*/
private void assertInvalidString(final String string) {
try {
converter.convertFromText(string, PackagingProvider.class, null);
fail("Expected a " + NullPointerException.class);
} catch (final NullPointerException expected) {
assertEquals("Unsupported packaging id '" + string + "'", expected.getMessage());
}
}
@Before
public void setUp() {
// Mocks
MockitoAnnotations.initMocks(this);
setUpMockPackagingProvider(mockCoreJarPackaging, CORE_JAR_ID, true);
setUpMockPackagingProvider(mockCustomJarPackaging, CUSTOM_JAR_ID, true);
setUpMockPackagingProvider(mockWarPackaging, CORE_WAR_ID, false);
// Object under test
converter = new PackagingProviderConverter();
converter.packagingProviderRegistry = mockPackagingProviderRegistry;
}
private void setUpMockPackagingProvider(final PackagingProvider mockPackagingProvider,
final String id, final boolean isDefault) {
when(mockPackagingProvider.getId()).thenReturn(id);
when(mockPackagingProvider.isDefault()).thenReturn(isDefault);
}
@Test
public void testConvertEmptyString() {
assertInvalidString("");
}
@Test
public void testConvertNullString() {
assertInvalidString(null);
}
@Test
public void testConvertPartialString() {
assertInvalidString(CORE_WAR_ID.substring(0, 1));
}
@Test
public void testConvertUnknownString() {
assertInvalidString("ear");
}
@Test
public void testConvertValidString() {
// Set up
final String id = "some-id";
when(mockPackagingProviderRegistry.getPackagingProvider(id)).thenReturn(mockCoreJarPackaging);
// Invoke
final PackagingProvider packagingProvider =
converter.convertFromText(id, PackagingProvider.class, null);
// Check
assertEquals(mockCoreJarPackaging, packagingProvider);
}
@Test
public void testDoesNotSupportWrongType() {
assertFalse(converter.supports(JavaType.class, null));
}
@Test
public void testGetAllPossibleValues() {
// Set up
final PackagingProvider[] providers =
{mockCoreJarPackaging, mockCustomJarPackaging, mockWarPackaging};
when(mockPackagingProviderRegistry.getAllPackagingProviders()).thenReturn(
Arrays.asList(providers));
final List<Completion> expectedCompletions = new ArrayList<Completion>();
for (final PackagingProvider provider : providers) {
expectedCompletions.add(new Completion(provider.getId().toUpperCase()));
}
final List<Completion> completions = new ArrayList<Completion>();
// Invoke
final boolean addSpace =
converter.getAllPossibleValues(completions, PackagingProvider.class, "ignored", null, null);
// Check
assertTrue(addSpace);
assertEquals(expectedCompletions.size(), completions.size());
assertTrue("Expected " + expectedCompletions + " but was " + completions,
completions.containsAll(expectedCompletions));
}
@Test
public void testSupportsCorrectType() {
assertTrue(converter.supports(PackagingProvider.class, null));
}
}