1 package com.github.mygreen.supercsv.builder;
2
3 import static org.junit.Assert.*;
4
5 import java.util.List;
6
7 import static org.assertj.core.api.Assertions.*;
8
9
10 import org.junit.Before;
11 import org.junit.Test;
12 import org.supercsv.exception.SuperCsvException;
13
14 import com.github.mygreen.supercsv.annotation.CsvBean;
15 import com.github.mygreen.supercsv.annotation.CsvColumn;
16 import com.github.mygreen.supercsv.annotation.CsvPartial;
17 import com.github.mygreen.supercsv.builder.BeanMappingFactory;
18 import com.github.mygreen.supercsv.exception.SuperCsvInvalidAnnotationException;
19
20
21
22
23
24
25
26
27
28 public class BeanMappingFactoryTest {
29
30 private BeanMappingFactory factory;
31
32 private BeanMappingFactory lazyFactory;
33
34 private final Class<?>[] groupEmpty = new Class[]{};
35
36 @Before
37 public void setUp() throws Exception {
38 this.factory = new BeanMappingFactory();
39 this.lazyFactory = new LazyBeanMappingFactory();
40 }
41
42
43
44
45 @Test(expected=NullPointerException.class)
46 public void testConstructor_argNull() {
47
48 factory.create(null, groupEmpty);
49
50 fail();
51
52 }
53
54
55
56
57 @Test
58 public void testCreate_modifires() {
59
60 BeanMapping<AllModifiresBean> beanMapping = factory.create(AllModifiresBean.class, groupEmpty);
61
62 assertThat(beanMapping.getColumns()).hasSize(4);
63
64 }
65
66
67
68
69 @Test
70 public void testCreate_beanAnno_no() {
71
72 assertThatThrownBy(() -> factory.create(NoBeanAnnoBean.class, groupEmpty))
73 .isInstanceOf(SuperCsvInvalidAnnotationException.class)
74 .hasMessage("'%s' において、アノテーション @CsvBean が見つかりません。",
75 NoBeanAnnoBean.class.getName());
76 }
77
78
79
80
81 @Test
82 public void testCreate_columnAnno_no() {
83
84 assertThatThrownBy(() -> factory.create(NoColumnAnnoBean.class, groupEmpty))
85 .isInstanceOf(SuperCsvInvalidAnnotationException.class)
86 .hasMessage("'%s' において、アノテーション @CsvColumn が見つかりません。",
87 NoColumnAnnoBean.class.getName());
88
89 }
90
91
92
93
94 @Test
95 public void testCreate_columnAnno_numberWrong_lessZero() {
96
97 assertThatThrownBy(() -> factory.create(ColumnNumberLessZeroBean.class, groupEmpty))
98 .isInstanceOf(SuperCsvInvalidAnnotationException.class)
99 .hasMessage("'%s' において、アノテーション @CsvColumn の属性 'number' の値(0)は、1以上の値を設定してください。",
100 ColumnNumberLessZeroBean.class.getName());
101
102 }
103
104
105
106
107 @Test
108 public void testCreate_columnAnno_numberWrong_duplicate() {
109
110 assertThatThrownBy(() -> factory.create(ColumnNumberDuplicateBean.class, groupEmpty))
111 .isInstanceOf(SuperCsvInvalidAnnotationException.class)
112 .hasMessage("'%s' において、アノテーション @CsvColumn の属性 'number' の値([2])が重複しています。",
113 ColumnNumberDuplicateBean.class.getName());
114
115 }
116
117
118
119
120 @Test
121 public void testCreate_partial_noAnno() {
122
123 BeanMapping<PartialNoAnnoBean> beanMapping = factory.create(PartialNoAnnoBean.class, groupEmpty);
124
125 assertThat(beanMapping.getColumns()).hasSize(4);
126
127 {
128
129 ColumnMapping column = beanMapping.getColumnMapping(1).get();
130 assertThat(column.isPartialized()).isTrue();
131 assertThat(column.getField()).isNull();
132 assertThat(column.getName()).isNull();
133 assertThat(column.getLabel()).isEqualTo("column1");
134 assertThat(column.getCellProcessorForReading()).isNull();
135 assertThat(column.getCellProcessorForWriting()).isNull();
136
137 }
138
139 {
140
141 ColumnMapping column = beanMapping.getColumnMapping(2).get();
142 assertThat(column.isPartialized()).isFalse();
143 assertThat(column.getField()).isNotNull();
144 assertThat(column.getName()).isEqualTo("col2");
145 assertThat(column.getLabel()).isEqualTo("col2");
146 assertThat(column.getCellProcessorForReading()).isNotNull();
147 assertThat(column.getCellProcessorForWriting()).isNotNull();
148
149 }
150
151 {
152
153 ColumnMapping column = beanMapping.getColumnMapping(3).get();
154 assertThat(column.isPartialized()).isTrue();
155 assertThat(column.getField()).isNull();
156 assertThat(column.getName()).isNull();
157 assertThat(column.getLabel()).isEqualTo("column3");
158 assertThat(column.getCellProcessorForReading()).isNull();
159 assertThat(column.getCellProcessorForWriting()).isNull();
160
161 }
162
163 {
164
165 ColumnMapping column = beanMapping.getColumnMapping(4).get();
166 assertThat(column.isPartialized()).isFalse();
167 assertThat(column.getField()).isNotNull();
168 assertThat(column.getName()).isEqualTo("col4");
169 assertThat(column.getLabel()).isEqualTo("カラム4");
170 assertThat(column.getCellProcessorForReading()).isNotNull();
171 assertThat(column.getCellProcessorForWriting()).isNotNull();
172
173 }
174
175 }
176
177
178
179
180 @Test
181 public void testCreate_partial_existAnno() {
182
183 BeanMapping<PartialExistAnnoBean> beanMapping = factory.create(PartialExistAnnoBean.class, groupEmpty);
184
185 assertThat(beanMapping.getColumns()).hasSize(5);
186
187 {
188
189 ColumnMapping column = beanMapping.getColumnMapping(1).get();
190 assertThat(column.isPartialized()).isTrue();
191 assertThat(column.getField()).isNull();
192 assertThat(column.getName()).isNull();
193 assertThat(column.getLabel()).isEqualTo("カラム1");
194 assertThat(column.getCellProcessorForReading()).isNull();
195 assertThat(column.getCellProcessorForWriting()).isNull();
196
197 }
198
199 {
200
201 ColumnMapping column = beanMapping.getColumnMapping(2).get();
202 assertThat(column.isPartialized()).isFalse();
203 assertThat(column.getField()).isNotNull();
204 assertThat(column.getName()).isEqualTo("col2");
205 assertThat(column.getLabel()).isEqualTo("col2");
206 assertThat(column.getCellProcessorForReading()).isNotNull();
207 assertThat(column.getCellProcessorForWriting()).isNotNull();
208
209 }
210
211 {
212
213 ColumnMapping column = beanMapping.getColumnMapping(3).get();
214 assertThat(column.isPartialized()).isTrue();
215 assertThat(column.getField()).isNull();
216 assertThat(column.getName()).isNull();
217 assertThat(column.getLabel()).isEqualTo("カラム3");
218 assertThat(column.getCellProcessorForReading()).isNull();
219 assertThat(column.getCellProcessorForWriting()).isNull();
220
221 }
222
223 {
224
225 ColumnMapping column = beanMapping.getColumnMapping(4).get();
226 assertThat(column.isPartialized()).isFalse();
227 assertThat(column.getField()).isNotNull();
228 assertThat(column.getName()).isEqualTo("col4");
229 assertThat(column.getLabel()).isEqualTo("カラム4");
230 assertThat(column.getCellProcessorForReading()).isNotNull();
231 assertThat(column.getCellProcessorForWriting()).isNotNull();
232 }
233
234 {
235
236 ColumnMapping column = beanMapping.getColumnMapping(5).get();
237 assertThat(column.isPartialized()).isTrue();
238 assertThat(column.getField()).isNull();
239 assertThat(column.getName()).isNull();
240 assertThat(column.getLabel()).isEqualTo("カラム5");
241 assertThat(column.getCellProcessorForReading()).isNull();
242 assertThat(column.getCellProcessorForWriting()).isNull();
243
244 }
245
246 }
247
248
249
250
251 @Test
252 public void testCreate_partial_overSize() {
253
254 assertThatThrownBy(() -> factory.create(PartialOverSizeBean.class, groupEmpty))
255 .isInstanceOf(SuperCsvInvalidAnnotationException.class)
256 .hasMessage("'%s' において、アノテーション @CsvPartial の属性 'columnSize' の値 (2) は、定義している最大の @CsvColumn の属性 'number' の値(4)以上の設定をしてください。",
257 PartialOverSizeBean.class.getName());
258
259 }
260
261
262
263
264 @Test
265 public void testValidateNonDeterminedColumns() {
266
267 BeanMapping<NonDeterminedColumnBean> beanMapping = lazyFactory.create(NonDeterminedColumnBean.class, groupEmpty);
268
269 Class<?> beanType = beanMapping.getType();
270 List<ColumnMapping> list = beanMapping.getColumns();
271 String[] headers = new String[] {"カラム", "カラム2", "カラム三"};
272
273 assertThatThrownBy(() -> BeanMappingFactoryHelper.validateNonDeterminedColumnNumber(beanType, list, headers))
274 .isInstanceOf(SuperCsvException.class)
275 .hasMessage("'%s' のヘッダー([カラム, カラム2, カラム三])において、定義しているが一致しないラベル([カラム1, カラム3])があります。",
276 NonDeterminedColumnBean.class.getName());
277
278 }
279
280
281
282
283
284 @CsvBean
285 class AllModifiresBean {
286
287 @CsvColumn(number=1)
288 public String fpublic;
289
290 @CsvColumn(number=2)
291 protected String fprotected;
292
293 @CsvColumn(number=3)
294 String fdefault;
295
296 @CsvColumn(number=4)
297 private String fprivate;
298
299 public String getFpublic() {
300 return fpublic;
301 }
302
303 public void setFpublic(String fpublic) {
304 this.fpublic = fpublic;
305 }
306
307 public String getFprotected() {
308 return fprotected;
309 }
310
311 public void setFprotected(String fprotected) {
312 this.fprotected = fprotected;
313 }
314
315 public String getFdefault() {
316 return fdefault;
317 }
318
319 public void setFdefault(String fdefault) {
320 this.fdefault = fdefault;
321 }
322
323 public String getFprivate() {
324 return fprivate;
325 }
326
327 public void setFprivate(String fprivate) {
328 this.fprivate = fprivate;
329 }
330 }
331
332
333
334
335
336 private static class NoBeanAnnoBean {
337
338 @CsvColumn(number=1)
339 private String col1;
340
341 }
342
343
344
345
346
347 @CsvBean
348 private static class NoColumnAnnoBean {
349
350 private String col1;
351
352 }
353
354
355
356
357
358 @CsvBean
359 private static class ColumnNumberLessZeroBean {
360
361 @CsvColumn(number=0)
362 private String col1;
363
364 @CsvColumn(number=1)
365 private String col2;
366 }
367
368
369
370
371
372 @CsvBean
373 private static class ColumnNumberDuplicateBean {
374
375 @CsvColumn(number=1)
376 private String col1;
377
378 @CsvColumn(number=2)
379 private String col2;
380
381 @CsvColumn(number=2)
382 private String col3;
383
384 @CsvColumn(number=4)
385 private String col4;
386 }
387
388
389
390
391
392 @CsvBean
393 private static class PartialNoAnnoBean {
394
395 @CsvColumn(number=2)
396 private String col2;
397
398 @CsvColumn(number=4, label="カラム4")
399 private String col4;
400
401 }
402
403
404
405
406
407 @CsvBean
408 @CsvPartial(columnSize=5, headers={
409 @CsvPartial.Header(number=1, label="カラム1"),
410 @CsvPartial.Header(number=3, label="カラム3"),
411 @CsvPartial.Header(number=5, label="カラム5"),
412 })
413 private static class PartialExistAnnoBean {
414
415 @CsvColumn(number=2)
416 private String col2;
417
418 @CsvColumn(number=4, label="カラム4")
419 private String col4;
420
421 }
422
423
424
425
426
427 @CsvBean
428 @CsvPartial(columnSize=2)
429 private static class PartialOverSizeBean {
430
431 @CsvColumn(number=2)
432 private String col2;
433
434 @CsvColumn(number=4, label="カラム4")
435 private String col4;
436
437 }
438
439
440
441
442
443 @CsvBean
444 private static class NonDeterminedColumnBean {
445
446 @CsvColumn(label="カラム1")
447 private String col1;
448
449 @CsvColumn(number=1)
450 private String col2;
451
452 @CsvColumn(label="カラム3")
453 private String col3;
454 }
455 }