package org.springframework.shell.converters; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.hamcrest.Description; import org.hamcrest.DiagnosingMatcher; import org.hamcrest.Matcher; import org.junit.Before; import org.junit.Test; import org.springframework.shell.core.Completion; import org.springframework.shell.core.Converter; /** * Tests for ArrayConverter. * * @author Eric Bottard */ public class ArrayConverterTest { private ArrayConverter arrayConverter; @Before public void setUp() throws Exception { FileConverter fileConverter = new FileConverter() { @Override protected File getWorkingDirectory() { return new File("."); } }; arrayConverter = new ArrayConverter(); Set<Converter<?>> allConverters = new HashSet<Converter<?>>(); allConverters.add(fileConverter); allConverters.add(arrayConverter); allConverters.add(new IntegerConverter()); arrayConverter.setConverters(allConverters); } @Test public void testInferredFileSeparator() throws IOException { String raw = "src/main" + File.pathSeparator + "src/main/java"; File main = new File("src/main").getCanonicalFile(); File src = new File("src/main/java").getCanonicalFile(); assertThat(arrayConverter.supports(File[].class, ""), equalTo(true)); File[] result = (File[]) arrayConverter.convertFromText(raw, File[].class, ""); assertThat(result, arrayContaining(main, src)); } @Test public void testDefaultDelimiter() { assertThat(arrayConverter.supports(Integer[].class, ""), equalTo(true)); Integer[] result = (Integer[]) arrayConverter.convertFromText("1,2,3,4,5", Integer[].class, ""); assertThat(result, arrayContaining(1, 2, 3, 4, 5)); } @Test public void testOverriddenDelimiter() { assertThat(arrayConverter.supports(Integer[].class, "splittingRegex=;"), equalTo(true)); Integer[] result = (Integer[]) arrayConverter.convertFromText("1;2;3;4;5", Integer[].class, "splittingRegex=;"); assertThat(result, arrayContaining(1, 2, 3, 4, 5)); } @Test public void testUnsupportedType() { assertThat(arrayConverter.supports(Integer.class, ""), equalTo(false)); assertThat(arrayConverter.supports(Float[].class, ""), equalTo(false)); } @Test public void testOptOut() { assertThat(arrayConverter.supports(Integer[].class, "disable-array-converter"), equalTo(false)); } @Test @SuppressWarnings("unchecked") public void testCompletions() throws IOException { String raw = ("src/test/java/" + File.pathSeparator + "src/main/").replace('/', File.separatorChar); String match1 = ("src/test/java/" + File.pathSeparator + "src/main/java/").replace('/', File.separatorChar); String match2 = ("src/test/java/" + File.pathSeparator + "src/main/resources/").replace('/', File.separatorChar); List<Completion> completions = new ArrayList<Completion>(); arrayConverter.getAllPossibleValues(completions, File[].class, raw, "", null); assertThat(completions, containsInAnyOrder( completionWhoseValue(equalTo(match1)), completionWhoseValue(equalTo(match2)))); } private Matcher<Completion> completionWhoseValue(final Matcher<String> matcher) { return new DiagnosingMatcher<Completion>() { @Override public void describeTo(Description description) { description.appendText("a completion that ").appendDescriptionOf(matcher); } @Override protected boolean matches(Object item, Description mismatchDescription) { Completion completion = (Completion) item; boolean match = matcher.matches(completion.getValue()); matcher.describeMismatch(completion.getValue(), mismatchDescription); return match; } }; } }