package com.github.mygreen.supercsv.builder.standard; import static org.junit.Assert.*; import static org.assertj.core.api.Assertions.*; import static com.github.mygreen.supercsv.tool.TestUtils.*; import java.lang.annotation.Annotation; import java.util.Comparator; import java.util.List; import java.util.ResourceBundle; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.runners.Enclosed; import org.junit.rules.TestName; import org.junit.runner.RunWith; 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.builder.ProcessorBuilderResolver; import com.github.mygreen.supercsv.builder.BeanMapping; import com.github.mygreen.supercsv.builder.BeanMappingFactory; import com.github.mygreen.supercsv.builder.ColumnMapping; import com.github.mygreen.supercsv.builder.Configuration; import com.github.mygreen.supercsv.builder.FieldAccessor; import com.github.mygreen.supercsv.cellprocessor.format.TextFormatter; import com.github.mygreen.supercsv.cellprocessor.format.TextParseException; import com.github.mygreen.supercsv.exception.SuperCsvValidationException; import com.github.mygreen.supercsv.localization.MessageResolver; import com.github.mygreen.supercsv.localization.ResourceBundleMessageResolver; import com.github.mygreen.supercsv.validation.CsvExceptionConverter; /** * Test the {@link CharacterProcessorBuilder} * * @version 2.0 * @since 1.2 * @author T.TSUCHIE * */ @RunWith(Enclosed.class) public class CharacterProcessorBuilderTest { /** * フォーマッタのテスト * */ public static class FormatterTest { @Rule public TestName name = new TestName(); private Configuration config; private ProcessorBuilderResolver builderResolver; private Comparator<Annotation> comparator; @Before public void setUp() { this.config = new Configuration(); this.builderResolver = config.getBuilderResolver(); this.comparator = config.getAnnoationComparator(); } @CsvBean private static class TestCsv { @CsvColumn(number=1) char col_primitive; @CsvColumn(number=2) Character col_wrapper; } @Test public void testParsePrint_primitive() { FieldAccessor field = getFieldAccessor(TestCsv.class, "col_primitive", comparator); CharacterProcessorBuilder builder = (CharacterProcessorBuilder) builderResolver.resolve(char.class); TextFormatter<Character> formatter = builder.getFormatter(field, config); { // parse assertThat(formatter.parse("a")).isEqualTo('a'); assertThat(formatter.parse("abc")).isEqualTo('a'); assertThatThrownBy(() -> formatter.parse("")).isInstanceOf(TextParseException.class); } { //print assertThat(formatter.print('a')).isEqualTo("a"); } } @Test public void testParsePrint_wrapper() { FieldAccessor field = getFieldAccessor(TestCsv.class, "col_wrapper", comparator); CharacterProcessorBuilder builder = (CharacterProcessorBuilder) builderResolver.resolve(Character.class); TextFormatter<Character> formatter = builder.getFormatter(field, config); { // parse assertThat(formatter.parse("a")).isEqualTo(toCharacter("a")); assertThat(formatter.parse("abc")).isEqualTo(toCharacter("a")); assertThatThrownBy(() -> formatter.parse("")).isInstanceOf(TextParseException.class); } { //print assertThat(formatter.print('a')).isEqualTo("a"); assertThatThrownBy(() -> formatter.parse(null)).isInstanceOf(NullPointerException.class); } } @Test public void testMessageAndVariables() { FieldAccessor field = getFieldAccessor(TestCsv.class, "col_primitive", comparator); CharacterProcessorBuilder builder = (CharacterProcessorBuilder) builderResolver.resolve(char.class); TextFormatter<Character> formatter = builder.getFormatter(field, config); formatter.setValidationMessage("テストメッセージ"); assertThat(formatter.getValidationMessage()).isEmpty(); assertThat(formatter.getMessageVariables()).isEmpty(); } @Test public void testPattern() { FieldAccessor field = getFieldAccessor(TestCsv.class, "col_primitive", comparator); CharacterProcessorBuilder builder = (CharacterProcessorBuilder) builderResolver.resolve(char.class); TextFormatter<Character> formatter = builder.getFormatter(field, config); assertThat(formatter.getPattern()).isEmpty(); } } /** * Tests for wrapper Character. * */ public static class WrappterTest { @Rule public TestName name = new TestName(); private BeanMappingFactory beanMappingFactory; private CsvExceptionConverter exceptionConverter; private final Class<?>[] groupEmpty = new Class[]{}; private MessageResolver testMessageResolver; @Before public void setUp() { this.beanMappingFactory = new BeanMappingFactory(); this.exceptionConverter = new CsvExceptionConverter(); this.testMessageResolver = new ResourceBundleMessageResolver(ResourceBundle.getBundle("TestMessages")); } private static final Character TEST_VALUE_1_OBJ = toCharacter("a"); private static final String TEST_VALUE_1_STR_NORMAL = "a"; @CsvBean private static class TestCsv { @CsvColumn(number=1) Character col_default; } @Test public void testBuildForReading_default() { BeanMapping<TestCsv> beanMapping = beanMappingFactory.create(TestCsv.class, groupEmpty); ColumnMapping columnMapping = beanMapping.getColumnMapping("col_default").get(); CellProcessor processor = columnMapping.getCellProcessorForReading(); printCellProcessorChain(processor, name.getMethodName()); { // null input String input = null; Character expected = null; assertThat((Object)processor.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } { // empty input String input = ""; Character expected = null; assertThat((Object)processor.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } { // valid input String input = TEST_VALUE_1_STR_NORMAL; Character expected = TEST_VALUE_1_OBJ; assertThat((Object)processor.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } { // valid input - over size String input = "abc"; Character expected = TEST_VALUE_1_OBJ; assertThat((Object)processor.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } } @Test public void testBuildForWriging_default() { BeanMapping<TestCsv> beanMapping = beanMappingFactory.create(TestCsv.class, groupEmpty); ColumnMapping columnMapping = beanMapping.getColumnMapping("col_default").get(); CellProcessor processor = columnMapping.getCellProcessorForWriting(); printCellProcessorChain(processor, name.getMethodName()); { // null input String input = null; String expected = null; assertThat((Object)processor.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } { // valid input Character input = TEST_VALUE_1_OBJ; String expected = TEST_VALUE_1_STR_NORMAL; assertThat((Object)processor.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } } } /** * Tests for primitive * */ public static class PrimitiveTest { @Rule public TestName name = new TestName(); private BeanMappingFactory beanMappingFactory; private CsvExceptionConverter exceptionConverter; private final Class<?>[] groupEmpty = new Class[]{}; private MessageResolver testMessageResolver; @Before public void setUp() { this.beanMappingFactory = new BeanMappingFactory(); this.exceptionConverter = new CsvExceptionConverter(); this.testMessageResolver = new ResourceBundleMessageResolver(ResourceBundle.getBundle("TestMessages")); } private static final char TEST_VALUE_PRIMITIVE_INIT_OBJ = '\u0000'; private static final char TEST_VALUE_1_OBJ = 'a'; private static final String TEST_VALUE_1_STR_NORMAL = "a"; @CsvBean private static class TestCsv { @CsvColumn(number=1) char col_default; } @Test public void testBuildForReading_default() { BeanMapping<TestCsv> beanMapping = beanMappingFactory.create(TestCsv.class, groupEmpty); ColumnMapping columnMapping = beanMapping.getColumnMapping("col_default").get(); CellProcessor processor = columnMapping.getCellProcessorForReading(); printCellProcessorChain(processor, name.getMethodName()); { // null input String input = null; char expected = TEST_VALUE_PRIMITIVE_INIT_OBJ; assertThat((Object)processor.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } { // empty input String input = ""; char expected = TEST_VALUE_PRIMITIVE_INIT_OBJ; assertThat((Object)processor.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } { // valid input String input = TEST_VALUE_1_STR_NORMAL; char expected = TEST_VALUE_1_OBJ; assertThat((Object)processor.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } { // valid input - size over String input = "abc"; char expected = TEST_VALUE_1_OBJ; assertThat((Object)processor.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } } @Test public void testBuildForWriging_default() { BeanMapping<TestCsv> beanMapping = beanMappingFactory.create(TestCsv.class, groupEmpty); ColumnMapping columnMapping = beanMapping.getColumnMapping("col_default").get(); CellProcessor processor = columnMapping.getCellProcessorForWriting(); printCellProcessorChain(processor, name.getMethodName()); { // null input String input = null; String expected = null; assertThat((Object)processor.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } { // valid input char input = TEST_VALUE_1_OBJ; String expected = TEST_VALUE_1_STR_NORMAL; assertThat((Object)processor.execute(input, ANONYMOUS_CSVCONTEXT)).isEqualTo(expected); } } } }