package com.github.mygreen.supercsv.cellprocessor.conversion; import static org.junit.Assert.*; import java.util.Optional; import static org.assertj.core.api.Assertions.*; import static com.github.mygreen.supercsv.tool.TestUtils.*; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestName; import org.supercsv.cellprocessor.ift.CellProcessor; import com.github.mygreen.supercsv.annotation.CsvBean; import com.github.mygreen.supercsv.annotation.CsvColumn; import com.github.mygreen.supercsv.annotation.conversion.CsvTruncate; import com.github.mygreen.supercsv.builder.AnnotationComparator; import com.github.mygreen.supercsv.builder.ProcessorBuilderResolver; import com.github.mygreen.supercsv.builder.BuildCase; import com.github.mygreen.supercsv.builder.Configuration; import com.github.mygreen.supercsv.builder.FieldAccessor; import com.github.mygreen.supercsv.builder.standard.StringProcessorBuilder; import com.github.mygreen.supercsv.cellprocessor.format.TextFormatter; import com.github.mygreen.supercsv.exception.SuperCsvInvalidAnnotationException; /** * {@link TruncateFactory}のテスタ * * @since 2.0 * @author T.TSUCHIE * */ public class TruncateFactoryTest { @Rule public TestName name = new TestName(); private TruncateFactory factory; private Configuration config; private final Class<?>[] groupEmpty = new Class[]{}; private final AnnotationComparator comparator = new AnnotationComparator(); private final ProcessorBuilderResolver builderResolver = new ProcessorBuilderResolver(); @Before public void setUp() throws Exception { this.factory = new TruncateFactory(); this.config = new Configuration(); } @CsvBean private static class TestCsv { @CsvColumn(number=1) @CsvTruncate(maxSize=3) private String col_default; @CsvColumn(number=2) @CsvTruncate(maxSize=3, suffix="...") private String col_suffix; } @CsvBean private static class ErrorCsv { @CsvTruncate(maxSize=0) private String col_wrong_maxSize; } @Test public void testCreate_default() { FieldAccessor field = getFieldAccessor(TestCsv.class, "col_default", comparator); StringProcessorBuilder builder = (StringProcessorBuilder) builderResolver.resolve(String.class); TextFormatter<String> formatter = builder.getFormatter(field, config); CsvTruncate anno = field.getAnnotationsByGroup(CsvTruncate.class, groupEmpty).get(0); { //next null Optional<CellProcessor> processor = factory.create(anno, Optional.empty(), field, formatter, config); printCellProcessorChain(processor.get(), name.getMethodName()); assertThat(processor.get()).isInstanceOf(Truncate.class); Truncate actual = (Truncate)processor.get(); assertThat(actual.getMaxSize()).isEqualTo(3); assertThat(actual.getSuffix()).isEqualTo(""); { String input = "abc"; String expected = "abc"; assertThat((Object)actual.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } { String input = "abcd"; String expected = "abc"; assertThat((Object)actual.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } } { //next exist Optional<CellProcessor> processor = factory.create(anno, Optional.of(new NextCellProcessor()), field, formatter, config); printCellProcessorChain(processor.get(), name.getMethodName()); assertThat(processor.get()).isInstanceOf(Truncate.class); Truncate actual = (Truncate)processor.get(); assertThat(actual.getMaxSize()).isEqualTo(3); assertThat(actual.getSuffix()).isEqualTo(""); { String input = "abc"; String expected = "abc"; assertThat((Object)actual.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } { String input = "abcd"; String expected = "abc"; assertThat((Object)actual.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } } } @Test public void testCreate_suffix() { FieldAccessor field = getFieldAccessor(TestCsv.class, "col_suffix", comparator); StringProcessorBuilder builder = (StringProcessorBuilder) builderResolver.resolve(String.class); TextFormatter<String> formatter = builder.getFormatter(field, config); CsvTruncate anno = field.getAnnotationsByGroup(CsvTruncate.class, groupEmpty).get(0); { //next null Optional<CellProcessor> processor = factory.create(anno, Optional.empty(), field, formatter, config); printCellProcessorChain(processor.get(), name.getMethodName()); assertThat(processor.get()).isInstanceOf(Truncate.class); Truncate actual = (Truncate)processor.get(); assertThat(actual.getMaxSize()).isEqualTo(3); assertThat(actual.getSuffix()).isEqualTo("..."); { String input = "abc"; String expected = "abc"; assertThat((Object)actual.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } { String input = "abcd"; String expected = "abc..."; assertThat((Object)actual.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } } { //next exist Optional<CellProcessor> processor = factory.create(anno, Optional.of(new NextCellProcessor()), field, formatter, config); printCellProcessorChain(processor.get(), name.getMethodName()); assertThat(processor.get()).isInstanceOf(Truncate.class); Truncate actual = (Truncate)processor.get(); assertThat(actual.getMaxSize()).isEqualTo(3); assertThat(actual.getSuffix()).isEqualTo("..."); { String input = "abc"; String expected = "abc"; assertThat((Object)actual.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } { String input = "abcd"; String expected = "abc..."; assertThat((Object)actual.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } } } @Test public void testCreate_wrong_maxSize() { FieldAccessor field = getFieldAccessor(ErrorCsv.class, "col_wrong_maxSize", comparator); StringProcessorBuilder builder = (StringProcessorBuilder) builderResolver.resolve(String.class); TextFormatter<String> formatter = builder.getFormatter(field, config); CsvTruncate anno = field.getAnnotationsByGroup(CsvTruncate.class, groupEmpty).get(0); try { factory.create(anno, Optional.empty(), field, formatter, config); fail(); } catch(Exception e) { assertThat(e).isInstanceOf(SuperCsvInvalidAnnotationException.class) .hasMessage("'%s' において、アノテーション @CsvTruncate の属性 'maxSize' の値(0)は、1以上の値を設定してください。", field.getNameWithClass()); // e.printStackTrace(); // SuperCsvInvalidAnnotationException exception = (SuperCsvInvalidAnnotationException)e; } } }