View Javadoc
1   package com.opencsv.bean;
2   
3   /*
4    Copyright 2007 Kyle Miller.
5   
6    Licensed under the Apache License, Version 2.0 (the "License");
7    you may not use this file except in compliance with the License.
8    You may obtain a copy of the License at
9   
10   http://www.apache.org/licenses/LICENSE-2.0
11  
12   Unless required by applicable law or agreed to in writing, software
13   distributed under the License is distributed on an "AS IS" BASIS,
14   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   See the License for the specific language governing permissions and
16   limitations under the License.
17   */
18  
19  import com.opencsv.CSVReader;
20  import com.opencsv.bean.mocks.MockBean;
21  import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
22  import org.junit.jupiter.api.*;
23  
24  import java.io.IOException;
25  import java.io.StringReader;
26  import java.util.List;
27  import java.util.Locale;
28  
29  import static org.junit.jupiter.api.Assertions.*;
30  
31  public class HeaderColumnNameMappingStrategyTest {
32  
33     private static final String TEST_STRING = "name,orderNumber,num\n" +
34           "kyle,abc123456,123\n" +
35           "jimmy,def098765,456";
36  
37      private static final String TEST_EMPTY_STRING = "name,orderNumber,num\n" +
38              "kyle,   ,123\n" +
39              "jimmy,,456";
40  
41     private static final String TEST_QUOTED_STRING = "\"name\",\"orderNumber\",\"num\"\n" +
42           "\"kyle\",\"abc123456\",\"123\"\n" +
43           "\"jimmy\",\"def098765\",\"456\"";
44  
45     private HeaderColumnNameMappingStrategy<MockBean> strat;
46     private static Locale systemLocale;
47  
48      @BeforeAll
49      public static void storeSystemLocale() {
50          systemLocale = Locale.getDefault();
51      }
52  
53      @AfterEach
54      public void setSystemLocaleBackToDefault() {
55          Locale.setDefault(systemLocale);
56      }
57  
58      @BeforeEach
59     public void setUp() {
60        Locale.setDefault(Locale.US);
61        strat = new HeaderColumnNameMappingStrategy<>();
62     }
63  
64     private List<MockBean> createTestParseResult(String parseString) {
65        strat.setType(MockBean.class);
66        CsvToBean<MockBean> csv = new CsvToBeanBuilder<MockBean>(new StringReader(parseString))
67                .withMappingStrategy(strat).build();
68        return csv.parse();
69     }
70  
71     @Test
72     public void testParse() {
73        List<MockBean> list = createTestParseResult(TEST_STRING);
74        assertNotNull(list);
75        assertEquals(2, list.size());
76        MockBean bean = list.get(0);
77        assertEquals("kyle", bean.getName());
78        assertEquals("abc123456", bean.getOrderNumber());
79        assertEquals(123, bean.getNum());
80     }
81  
82      @Test
83      public void testParseWithEmptyField() {
84          List<MockBean> list = createTestParseResult(TEST_EMPTY_STRING);
85          assertNotNull(list);
86          assertEquals(2, list.size());
87          MockBean bean = list.get(0);
88          assertEquals("kyle", bean.getName());
89          assertEquals("   ", bean.getOrderNumber());
90          assertEquals(123, bean.getNum());
91          bean = list.get(1);
92          assertEquals("jimmy", bean.getName());
93          assertNotNull(bean.getOrderNumber());
94          assertEquals("", bean.getOrderNumber());
95          assertEquals(456, bean.getNum());
96      }
97  
98     @Test
99     public void testQuotedString() {
100       List<MockBean> list = createTestParseResult(TEST_QUOTED_STRING);
101       assertNotNull(list);
102       assertEquals(2, list.size());
103       MockBean bean = list.get(0);
104       assertEquals("kyle", bean.getName());
105       assertEquals("abc123456", bean.getOrderNumber());
106       assertEquals(123, bean.getNum());
107    }
108 
109    @Test
110    public void testParseWithSpacesInHeader() {
111       List<MockBean> list = createTestParseResult(TEST_STRING);
112       assertNotNull(list);
113       assertEquals(2, list.size());
114       MockBean bean = list.get(0);
115       assertEquals("kyle", bean.getName());
116       assertEquals("abc123456", bean.getOrderNumber());
117       assertEquals(123, bean.getNum());
118    }
119 
120    @Test
121    public void verifyColumnNames() throws IOException, CsvRequiredFieldEmptyException {
122       strat = new HeaderColumnNameMappingStrategy<>();
123       strat.setType(MockBean.class);
124       assertNull(strat.getColumnName(0));
125 
126       StringReader reader = new StringReader(TEST_STRING);
127 
128       CSVReader csvReader = new CSVReader(reader);
129       strat.captureHeader(csvReader);
130 
131       assertEquals("name", strat.getColumnName(0));
132    }
133    
134    @Test
135    public void throwsIllegalStateExceptionIfTypeNotSetBeforeParse() {
136       strat = new HeaderColumnNameMappingStrategy<>();
137       StringReader reader = new StringReader(TEST_STRING);
138       CSVReader csvReader = new CSVReader(reader);
139       CsvToBean<Object> csvtb = new CsvToBeanBuilder<>(csvReader)
140               .withMappingStrategy(strat).build();
141       try {
142           csvtb.parse();
143       }
144       catch(RuntimeException e) {
145           assertEquals(IllegalStateException.class, e.getCause().getClass());
146       }
147    }
148 
149     @Test
150    public void throwsIllegalStateExceptionIfTypeNotSetBeforeGenerateHeaders() {
151       strat = new HeaderColumnNameMappingStrategy<>();
152         Assertions.assertThrows(IllegalStateException.class, () -> strat.generateHeader(new MockBean()));
153    }
154 }