package com.github.mygreen.supercsv.builder;
import static org.junit.Assert.*;
import static org.assertj.core.api.Assertions.*;
import org.junit.Before;
import org.junit.Test;
import com.github.mygreen.supercsv.annotation.CsvBean;
import com.github.mygreen.supercsv.annotation.CsvColumn;
import com.github.mygreen.supercsv.annotation.CsvPartial;
import com.github.mygreen.supercsv.builder.BeanMappingFactory;
import com.github.mygreen.supercsv.exception.SuperCsvInvalidAnnotationException;
/**
* {@link BeanMappingFactory}のテスタ
*
* @since 2.0
* @author T.TSUCHIE
*
*/
public class BeanMappingFactoryTest {
private BeanMappingFactory factory;
private final Class<?>[] groupEmpty = new Class[]{};
@Before
public void setUp() throws Exception {
factory = new BeanMappingFactory();
}
/**
* コンストラクタのテスト - 引数がnullの場合
*/
@Test(expected=NullPointerException.class)
public void testConstructor_argNull() {
factory.create(null, groupEmpty);
fail();
}
/**
* フィールドの修飾子のテスト
*/
@Test
public void testCreate_modifires() {
BeanMapping<AllModifiresBean> beanMapping = factory.create(AllModifiresBean.class, groupEmpty);
assertThat(beanMapping.getColumns()).hasSize(4);
}
/**
* {@link CsvBean}アノテーションが存在しない
*/
@Test
public void testCreate_beanAnno_no() {
assertThatThrownBy(() -> factory.create(NoBeanAnnoBean.class, groupEmpty))
.isInstanceOf(SuperCsvInvalidAnnotationException.class)
.hasMessage("'%s' において、アノテーション @CsvBean が見つかりません。",
NoBeanAnnoBean.class.getName());
}
/**
* {@link CsvColumn}アノテーションが存在しない
*/
@Test
public void testCreate_columnAnno_no() {
assertThatThrownBy(() -> factory.create(NoColumnAnnoBean.class, groupEmpty))
.isInstanceOf(SuperCsvInvalidAnnotationException.class)
.hasMessage("'%s' において、アノテーション @CsvColumn が見つかりません。",
NoColumnAnnoBean.class.getName());
}
/**
* {@link CsvColumn}アノテーションのnumber属性値が0以下の場合
*/
@Test
public void testCreate_columnAnno_numberWrong_lessZero() {
assertThatThrownBy(() -> factory.create(ColumnNumberLessZeroBean.class, groupEmpty))
.isInstanceOf(SuperCsvInvalidAnnotationException.class)
.hasMessage("'%s' において、アノテーション @CsvColumn の属性 'number' の値(0)は、1以上の値を設定してください。",
ColumnNumberLessZeroBean.class.getName());
}
/**
* {@link CsvColumn}アノテーションのnumber属性値が重複の場合
*/
@Test
public void testCreate_columnAnno_numberWrong_duplicate() {
assertThatThrownBy(() -> factory.create(ColumnNumberDuplicateBean.class, groupEmpty))
.isInstanceOf(SuperCsvInvalidAnnotationException.class)
.hasMessage("'%s' において、アノテーション @CsvColumn の属性 'number' の値([2])が重複しています。",
ColumnNumberDuplicateBean.class.getName());
}
/**
* 部分的なカラムの場合 - {@link CsvPartial}はない。
*/
@Test
public void testCreate_partial_noAnno() {
BeanMapping<PartialNoAnnoBean> beanMapping = factory.create(PartialNoAnnoBean.class, groupEmpty);
assertThat(beanMapping.getColumns()).hasSize(4);
{
// 部分的なカラム
ColumnMapping column = beanMapping.getColumnMapping(1).get();
assertThat(column.isPartialized()).isTrue();
assertThat(column.getField()).isNull();
assertThat(column.getName()).isNull();
assertThat(column.getLabel()).isEqualTo("column1");
assertThat(column.getCellProcessorForReading()).isNull();
assertThat(column.getCellProcessorForWriting()).isNull();
}
{
// 通常のカラム
ColumnMapping column = beanMapping.getColumnMapping(2).get();
assertThat(column.isPartialized()).isFalse();
assertThat(column.getField()).isNotNull();
assertThat(column.getName()).isEqualTo("col2");
assertThat(column.getLabel()).isEqualTo("col2");
assertThat(column.getCellProcessorForReading()).isNotNull();
assertThat(column.getCellProcessorForWriting()).isNotNull();
}
{
// 部分的なカラム
ColumnMapping column = beanMapping.getColumnMapping(3).get();
assertThat(column.isPartialized()).isTrue();
assertThat(column.getField()).isNull();
assertThat(column.getName()).isNull();
assertThat(column.getLabel()).isEqualTo("column3");
assertThat(column.getCellProcessorForReading()).isNull();
assertThat(column.getCellProcessorForWriting()).isNull();
}
{
// 通常のカラム
ColumnMapping column = beanMapping.getColumnMapping(4).get();
assertThat(column.isPartialized()).isFalse();
assertThat(column.getField()).isNotNull();
assertThat(column.getName()).isEqualTo("col4");
assertThat(column.getLabel()).isEqualTo("カラム4");
assertThat(column.getCellProcessorForReading()).isNotNull();
assertThat(column.getCellProcessorForWriting()).isNotNull();
}
}
/**
* 部分的なカラムの場合 - {@link CsvPartial}あり
*/
@Test
public void testCreate_partial_existAnno() {
BeanMapping<PartialExistAnnoBean> beanMapping = factory.create(PartialExistAnnoBean.class, groupEmpty);
assertThat(beanMapping.getColumns()).hasSize(5);
{
// 部分的なカラム
ColumnMapping column = beanMapping.getColumnMapping(1).get();
assertThat(column.isPartialized()).isTrue();
assertThat(column.getField()).isNull();
assertThat(column.getName()).isNull();
assertThat(column.getLabel()).isEqualTo("カラム1");
assertThat(column.getCellProcessorForReading()).isNull();
assertThat(column.getCellProcessorForWriting()).isNull();
}
{
// 通常のカラム
ColumnMapping column = beanMapping.getColumnMapping(2).get();
assertThat(column.isPartialized()).isFalse();
assertThat(column.getField()).isNotNull();
assertThat(column.getName()).isEqualTo("col2");
assertThat(column.getLabel()).isEqualTo("col2");
assertThat(column.getCellProcessorForReading()).isNotNull();
assertThat(column.getCellProcessorForWriting()).isNotNull();
}
{
// 部分的なカラム
ColumnMapping column = beanMapping.getColumnMapping(3).get();
assertThat(column.isPartialized()).isTrue();
assertThat(column.getField()).isNull();
assertThat(column.getName()).isNull();
assertThat(column.getLabel()).isEqualTo("カラム3");
assertThat(column.getCellProcessorForReading()).isNull();
assertThat(column.getCellProcessorForWriting()).isNull();
}
{
// 通常のカラム
ColumnMapping column = beanMapping.getColumnMapping(4).get();
assertThat(column.isPartialized()).isFalse();
assertThat(column.getField()).isNotNull();
assertThat(column.getName()).isEqualTo("col4");
assertThat(column.getLabel()).isEqualTo("カラム4");
assertThat(column.getCellProcessorForReading()).isNotNull();
assertThat(column.getCellProcessorForWriting()).isNotNull();
}
{
// 部分的なカラム
ColumnMapping column = beanMapping.getColumnMapping(5).get();
assertThat(column.isPartialized()).isTrue();
assertThat(column.getField()).isNull();
assertThat(column.getName()).isNull();
assertThat(column.getLabel()).isEqualTo("カラム5");
assertThat(column.getCellProcessorForReading()).isNull();
assertThat(column.getCellProcessorForWriting()).isNull();
}
}
/**
* 部分的なカラムの場合 - {@link CsvPartial}のcolumnSizeの値が、定義されているカラムよりも小さい場合
*/
@Test
public void testCreate_partial_overSize() {
assertThatThrownBy(() -> factory.create(PartialOverSizeBean.class, groupEmpty))
.isInstanceOf(SuperCsvInvalidAnnotationException.class)
.hasMessage("'%s' において、アノテーション @CsvPartial の属性 'columnSize' の値 (2) は、定義している最大の @CsvColumn の属性 'number' の値(4)以上の設定をしてください。",
PartialOverSizeBean.class.getName());
}
/**
* 修飾子の確認用のBean
*
*/
@CsvBean
class AllModifiresBean {
@CsvColumn(number=1)
public String fpublic;
@CsvColumn(number=2)
protected String fprotected;
@CsvColumn(number=3)
String fdefault;
@CsvColumn(number=4)
private String fprivate;
public String getFpublic() {
return fpublic;
}
public void setFpublic(String fpublic) {
this.fpublic = fpublic;
}
public String getFprotected() {
return fprotected;
}
public void setFprotected(String fprotected) {
this.fprotected = fprotected;
}
public String getFdefault() {
return fdefault;
}
public void setFdefault(String fdefault) {
this.fdefault = fdefault;
}
public String getFprivate() {
return fprivate;
}
public void setFprivate(String fprivate) {
this.fprivate = fprivate;
}
}
/**
* Bean用のアノテーションがない
*
*/
private static class NoBeanAnnoBean {
@CsvColumn(number=1)
private String col1;
}
/**
* カラム用のアノテーションがない
*
*/
@CsvBean
private static class NoColumnAnnoBean {
private String col1;
}
/**
* カラムの番号が0以下の場合
*
*/
@CsvBean
private static class ColumnNumberLessZeroBean {
@CsvColumn(number=0)
private String col1;
@CsvColumn(number=1)
private String col2;
}
/**
* カラムの番号が重複の場合
*
*/
@CsvBean
private static class ColumnNumberDuplicateBean {
@CsvColumn(number=1)
private String col1;
@CsvColumn(number=2)
private String col2;
@CsvColumn(number=2)
private String col3;
@CsvColumn(number=4)
private String col4;
}
/**
* 部分的なカラムの場合 - {@link CsvPartial}はない。
*
*/
@CsvBean
private static class PartialNoAnnoBean {
@CsvColumn(number=2)
private String col2;
@CsvColumn(number=4, label="カラム4")
private String col4;
}
/**
* 部分的なカラムの場合 - {@link CsvPartial}あり。
*
*/
@CsvBean
@CsvPartial(columnSize=5, headers={
@CsvPartial.Header(number=1, label="カラム1"),
@CsvPartial.Header(number=3, label="カラム3"),
@CsvPartial.Header(number=5, label="カラム5"),
})
private static class PartialExistAnnoBean {
@CsvColumn(number=2)
private String col2;
@CsvColumn(number=4, label="カラム4")
private String col4;
}
/**
* 部分的なカラムの場合 - 想定のサイズが定義されているカラムよりも小さい場合
*
*/
@CsvBean
@CsvPartial(columnSize=2)
private static class PartialOverSizeBean {
@CsvColumn(number=2)
private String col2;
@CsvColumn(number=4, label="カラム4")
private String col4;
}
}