package com.github.mygreen.supercsv.builder; import static org.junit.Assert.*; import static org.assertj.core.api.Assertions.*; import java.awt.Point; import java.io.StringReader; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; import org.supercsv.prefs.CsvPreference; import org.supercsv.util.CsvContext; import com.github.mygreen.supercsv.annotation.CsvBean; import com.github.mygreen.supercsv.annotation.CsvColumn; import com.github.mygreen.supercsv.annotation.CsvPostRead; import com.github.mygreen.supercsv.annotation.CsvPostWrite; import com.github.mygreen.supercsv.annotation.CsvPreRead; import com.github.mygreen.supercsv.annotation.CsvPreWrite; import com.github.mygreen.supercsv.io.CsvAnnotationBeanReader; import com.github.mygreen.supercsv.io.CsvAnnotationBeanWriter; import com.github.mygreen.supercsv.validation.CsvBindingErrors; import com.github.mygreen.supercsv.validation.CsvValidator; import com.github.mygreen.supercsv.validation.ValidationContext; /** * {@link CallbackMethod}のテスタ * * @since 2.0 * @author T.TSUCHIE * */ public class CallbackMethodTest { private BeanMappingFactory beanMappingFactory; @Before public void setUp() throws Exception { this.beanMappingFactory = new BeanMappingFactory(); } private static final String TEST_CSV = "ID,値" + "\r\n" + "1,a" + "\r\n" + "2,b" + "\r\n"; // テスト用のグループ private interface Group1 { } private interface Group2 { } @CsvBean(validators=TestValidator.class, listeners=TestListener.class, header=true) public static class TestCsv { private List<String> messages = new ArrayList<>(); @CsvColumn(number=1, label="ID") private Integer id; @CsvColumn(number=2, label="値") private String value; public TestCsv() { } public TestCsv(Integer id, String value) { this.id = id; this.value = value; } public void addMessage(String message, TestCsv record) { messages.add(message + "-" + record.id); } @CsvPreRead public void handlePreRead(final TestCsv record, final CsvContext context, final CsvBindingErrors bindingErrors, final Class<?>[] groups, final Point point) { addMessage("method::handlePreRead", record); assertThat(record).isNotNull() .hasFieldOrPropertyWithValue("id", null) .hasFieldOrPropertyWithValue("value", null); assertThat(context).isNotNull(); assertThat(bindingErrors).isNotNull(); assertThat(groups).containsExactly(Group1.class, Group2.class); assertThat(point).isNull();; } @CsvPostRead public void handlePostRead(final TestCsv record, final CsvContext context, final CsvBindingErrors bindingErrors, final Class<?>[] groups, final Point point) { addMessage("method::handlePostRead", record); assertThat(record).isNotNull() .hasNoNullFieldsOrProperties(); assertThat(context).isNotNull() .hasNoNullFieldsOrProperties(); assertThat(bindingErrors).isNotNull(); assertThat(groups).containsExactly(Group1.class, Group2.class); assertThat(point).isNull();; } @CsvPreWrite public void handlePreWrite(final TestCsv record, final CsvContext context, final CsvBindingErrors bindingErrors, final Class<?>[] groups, final Point point) { addMessage("method::handlePreWrite", record); assertThat(record).isNotNull() .hasNoNullFieldsOrProperties(); assertThat(context).isNotNull() .hasNoNullFieldsOrProperties(); assertThat(bindingErrors).isNotNull(); assertThat(groups).containsExactly(Group1.class, Group2.class); assertThat(point).isNull();; } @CsvPostWrite public void handlePostWrite(final TestCsv record, final CsvContext context, final CsvBindingErrors bindingErrors, final Class<?>[] groups, final Point point) { addMessage("method::handlePostWrite", record); assertThat(record).isNotNull() .hasNoNullFieldsOrProperties(); assertThat(context).isNotNull() .hasNoNullFieldsOrProperties(); assertThat(bindingErrors).isNotNull(); assertThat(groups).containsExactly(Group1.class, Group2.class); assertThat(point).isNull();; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } } private static class TestListener { private List<String> messages = new ArrayList<>(); public void addMessage(String message, TestCsv record) { messages.add(message + "-" + record.id); } @CsvPreRead public void handlePreRead(final TestCsv record, final CsvContext context, final CsvBindingErrors bindingErrors, final Class<?>[] groups, final Point point) { addMessage("listener::handlePreRead", record); record.addMessage("listener::handlePreRead", record); assertThat(record).isNotNull(); assertThat(context).isNotNull(); assertThat(bindingErrors).isNotNull(); assertThat(groups).containsExactly(Group1.class, Group2.class); assertThat(point).isNull();; } @CsvPostRead public void handlePostRead(final TestCsv record, final CsvContext context, final CsvBindingErrors bindingErrors, final Class<?>[] groups, final Point point) { addMessage("method::handlePostRead", record); record.addMessage("listener::handlePostRead", record); assertThat(record).isNotNull(); assertThat(context).isNotNull(); assertThat(bindingErrors).isNotNull(); assertThat(groups).containsExactly(Group1.class, Group2.class); assertThat(point).isNull();; } @CsvPreWrite public void handlePreWrite(final TestCsv record, final CsvContext context, final CsvBindingErrors bindingErrors, final Class<?>[] groups, final Point point) { addMessage("method::handlePreWrite", record); record.addMessage("listener::handlePreWrite", record); assertThat(record).isNotNull(); assertThat(context).isNotNull(); assertThat(bindingErrors).isNotNull(); assertThat(groups).containsExactly(Group1.class, Group2.class); assertThat(point).isNull();; } @CsvPostWrite public void handlePostWrite(final TestCsv record, final CsvContext context, final CsvBindingErrors bindingErrors, final Class<?>[] groups, final Point point) { addMessage("method::handlePostWrite", record); record.addMessage("listener::handlePostWrite", record); assertThat(record).isNotNull(); assertThat(context).isNotNull(); assertThat(bindingErrors).isNotNull(); assertThat(groups).containsExactly(Group1.class, Group2.class); assertThat(point).isNull();; } } private static class TestValidator implements CsvValidator<TestCsv> { private List<String> messages = new ArrayList<>(); @Override public void validate(final TestCsv record, final CsvBindingErrors bindingErrors, final ValidationContext<TestCsv> validationContext) { record.addMessage("validate::validate", record); addMessage("validate::validate", record); assertThat(record).isNotNull(); assertThat(bindingErrors).isNotNull(); assertThat(validationContext).isNotNull(); } public void addMessage(String message, TestCsv record) { messages.add(message + "-" + record.id); } } @Test public void testCreateBeanMapping() { BeanMapping<TestCsv> beanMapping = beanMappingFactory.create(TestCsv.class, Group1.class, Group2.class); assertThat(beanMapping.getValidators()).hasSize(1); assertThat(beanMapping.getListeners()).hasSize(1); assertThat(beanMapping.getPreReadMethods()).hasSize(2); assertThat(beanMapping.getPostReadMethods()).hasSize(2); assertThat(beanMapping.getPreWriteMethods()).hasSize(2); assertThat(beanMapping.getPostWriteMethods()).hasSize(2); } @Test public void testRead() throws Exception { CsvAnnotationBeanReader<TestCsv> csvReader = new CsvAnnotationBeanReader<>(TestCsv.class, new StringReader(TEST_CSV), CsvPreference.STANDARD_PREFERENCE, Group1.class, Group2.class); List<TestCsv> list = csvReader.readAll(false); for(TestCsv record : list) { assertThat(record.messages).containsExactly( "method::handlePreRead-null", "listener::handlePreRead-null", "validate::validate-" + record.getId(), "method::handlePostRead-" + record.getId(), "listener::handlePostRead-" + record.getId()); } csvReader.close(); } @Test public void testWrite() throws Exception { beanMappingFactory.getConfiguration().setSkipValidationOnWrite(false); BeanMapping<TestCsv> beanMapping = beanMappingFactory.create(TestCsv.class, Group1.class, Group2.class); StringWriter writer = new StringWriter(); CsvAnnotationBeanWriter<TestCsv> csvWriter = new CsvAnnotationBeanWriter<>(beanMapping, writer, CsvPreference.STANDARD_PREFERENCE); List<TestCsv> list = new ArrayList<>(); list.add(new TestCsv(1, "a")); list.add(new TestCsv(2, "b")); csvWriter.writeAll(list, true); csvWriter.close(); for(TestCsv record : list) { assertThat(record.messages).containsExactly( "method::handlePreWrite-" + record.getId(), "listener::handlePreWrite-" + record.getId(), "validate::validate-" + record.getId(), "method::handlePostWrite-" + record.getId(), "listener::handlePostWrite-" + record.getId()); } String csv = writer.toString(); assertThat(csv).isEqualTo(TEST_CSV); } }