1 #include <cppunit/CompilerOutputter.h>
2 #include <cppunit/TestCaller.h>
3 #include <cppunit/TestFixture.h>
4 #include <cppunit/extensions/TestFactoryRegistry.h>
5 #include <cppunit/ui/text/TestRunner.h>
6 
7 #include "csvstringfield.hh"
8 
9 class CSVStringFieldTest : public CppUnit::TestFixture {
10    public:
suite()11     static CppUnit::TestSuite *suite() {
12         CppUnit::TestSuite *suiteOfTests =
13             new CppUnit::TestSuite("CSV String Field");
14 
15         suiteOfTests->addTest(new CppUnit::TestCaller<CSVStringFieldTest>(
16             "should escape field", &CSVStringFieldTest::escape));
17 
18         suiteOfTests->addTest(new CppUnit::TestCaller<CSVStringFieldTest>(
19             "should properly handle escapeing double quote",
20             &CSVStringFieldTest::escapeDoubleQuote));
21 
22         suiteOfTests->addTest(new CppUnit::TestCaller<CSVStringFieldTest>(
23             "should not escape field", &CSVStringFieldTest::noEscape));
24 
25         suiteOfTests->addTest(new CppUnit::TestCaller<CSVStringFieldTest>(
26             "escape should properly handle empty string",
27             &CSVStringFieldTest::escapeEmptyField));
28 
29         suiteOfTests->addTest(new CppUnit::TestCaller<CSVStringFieldTest>(
30             "should unescape escaped field", &CSVStringFieldTest::unescape));
31 
32         suiteOfTests->addTest(new CppUnit::TestCaller<CSVStringFieldTest>(
33             "should not unescape wrongly escaped field",
34             &CSVStringFieldTest::unescapeWronglyEscapedField));
35 
36         suiteOfTests->addTest(new CppUnit::TestCaller<CSVStringFieldTest>(
37             "should not unescape non-escaped field",
38             &CSVStringFieldTest::noUnescape));
39 
40         suiteOfTests->addTest(new CppUnit::TestCaller<CSVStringFieldTest>(
41             "should properly handle empty field",
42             &CSVStringFieldTest::unescapeEmptyField));
43 
44         suiteOfTests->addTest(new CppUnit::TestCaller<CSVStringFieldTest>(
45             "should properly construct empty",
46             &CSVStringFieldTest::defaultConstructed));
47 
48         suiteOfTests->addTest(new CppUnit::TestCaller<CSVStringFieldTest>(
49             "should properly copy without prior function call",
50             &CSVStringFieldTest::copyNoPriorCall));
51 
52         suiteOfTests->addTest(new CppUnit::TestCaller<CSVStringFieldTest>(
53             "should properly copy with prior call",
54             &CSVStringFieldTest::copyPriorCall));
55 
56         suiteOfTests->addTest(new CppUnit::TestCaller<CSVStringFieldTest>(
57             "should properly move without prior function call",
58             &CSVStringFieldTest::moveNoPriorCall));
59 
60         suiteOfTests->addTest(new CppUnit::TestCaller<CSVStringFieldTest>(
61             "should properly move with prior call",
62             &CSVStringFieldTest::movePriorCall));
63 
64         return suiteOfTests;
65     }
66 
escape()67     void escape() {
68         yapet::CSVStringField csvStringField{"Test,field"};
69 
70         std::string actual{csvStringField.escape()};
71         std::string expected{"\"Test,field\""};
72         CPPUNIT_ASSERT_EQUAL(expected, actual);
73 
74         yapet::CSVStringField csvStringField2{"Test\nfield"};
75 
76         actual = csvStringField2.escape();
77         expected = "\"Test\nfield\"";
78         CPPUNIT_ASSERT_EQUAL(expected, actual);
79 
80         yapet::CSVStringField csvStringField3{"a\"a"};
81         actual = csvStringField3.escape();
82         expected = "a\"a";
83         CPPUNIT_ASSERT_EQUAL(expected, actual);
84 
85         yapet::CSVStringField csvStringField4{"a\""};
86         actual = csvStringField4.escape();
87         expected = "a\"";
88         CPPUNIT_ASSERT_EQUAL(expected, actual);
89     }
90 
escapeDoubleQuote()91     void escapeDoubleQuote() {
92         yapet::CSVStringField csvStringField{"Test,\"field\""};
93 
94         std::string actual = csvStringField.escape();
95         std::string expected{"\"Test,\"\"field\"\"\""};
96         CPPUNIT_ASSERT_EQUAL(expected, actual);
97 
98         yapet::CSVStringField csvStringField2{"Test \"field\""};
99 
100         actual = csvStringField2.escape();
101         expected = "Test \"field\"";
102         CPPUNIT_ASSERT_EQUAL(expected, actual);
103 
104         yapet::CSVStringField csvStringField3{",\"\"\""};
105         actual = csvStringField3.escape();
106         expected = "\",\"\"\"\"\"\"\"";
107         CPPUNIT_ASSERT_EQUAL(expected, actual);
108     }
109 
noEscape()110     void noEscape() {
111         yapet::CSVStringField csvStringField{"No escape necessary"};
112 
113         std::string actual = csvStringField.escape();
114         std::string expected{"No escape necessary"};
115         CPPUNIT_ASSERT_EQUAL(expected, actual);
116     }
117 
escapeEmptyField()118     void escapeEmptyField() {
119         yapet::CSVStringField csvStringField{""};
120 
121         std::string actual = csvStringField.escape();
122         std::string expected{""};
123 
124         CPPUNIT_ASSERT_EQUAL(expected, actual);
125     }
126 
unescape()127     void unescape() {
128         yapet::CSVStringField csvStringField{"\"test,\"\"field\""};
129 
130         std::string actual = csvStringField.unescape();
131         std::string expected{"test,\"field"};
132         CPPUNIT_ASSERT_EQUAL(expected, actual);
133 
134         yapet::CSVStringField csvStringField2{"\"\"\"\""};
135 
136         actual = csvStringField2.unescape();
137         expected = "\"";
138         CPPUNIT_ASSERT_EQUAL(expected, actual);
139 
140         yapet::CSVStringField csvStringField3{"\",\"\"\"\"\"\"\""};
141         actual = csvStringField3.unescape();
142         expected = ",\"\"\"";
143         CPPUNIT_ASSERT_EQUAL(expected, actual);
144 
145         yapet::CSVStringField csvStringField4{"a\"a"};
146         actual = csvStringField4.unescape();
147         expected = "a\"a";
148         CPPUNIT_ASSERT_EQUAL(expected, actual);
149 
150         yapet::CSVStringField csvStringField5{"a\""};
151         actual = csvStringField5.unescape();
152         expected = "a\"";
153         CPPUNIT_ASSERT_EQUAL(expected, actual);
154     }
155 
unescapeWronglyEscapedField()156     void unescapeWronglyEscapedField() {
157         yapet::CSVStringField csvStringField{"\"test,\"field\""};
158 
159         CPPUNIT_ASSERT_THROW(csvStringField.unescape(), std::invalid_argument);
160     }
161 
noUnescape()162     void noUnescape() {
163         yapet::CSVStringField csvStringField{"test field"};
164 
165         std::string actual = csvStringField.unescape();
166         std::string expected{"test field"};
167         CPPUNIT_ASSERT_EQUAL(expected, actual);
168 
169         yapet::CSVStringField csvStringField2{"test \" field"};
170 
171         actual = csvStringField2.unescape();
172         expected = "test \" field";
173         CPPUNIT_ASSERT_EQUAL(expected, actual);
174     }
175 
unescapeEmptyField()176     void unescapeEmptyField() {
177         yapet::CSVStringField csvStringField{""};
178 
179         std::string actual = csvStringField.unescape();
180         std::string expected{""};
181         CPPUNIT_ASSERT_EQUAL(expected, actual);
182     }
183 
defaultConstructed()184     void defaultConstructed() {
185         yapet::CSVStringField defaultConstructed;
186         std::string emptyString{};
187 
188         CPPUNIT_ASSERT_EQUAL(emptyString, defaultConstructed.escape());
189         CPPUNIT_ASSERT_EQUAL(emptyString, defaultConstructed.unescape());
190     }
191 
copyNoPriorCall()192     void copyNoPriorCall() {
193         // Unescape
194         yapet::CSVStringField csvStringField{"\"test,\"\"field\""};
195         yapet::CSVStringField empty{csvStringField};
196 
197         std::string actual = empty.unescape();
198         std::string expected{"test,\"field"};
199         CPPUNIT_ASSERT_EQUAL(expected, actual);
200 
201         yapet::CSVStringField csvStringField2{"\"test,\"\"field\""};
202         yapet::CSVStringField empty2{};
203 
204         empty2 = csvStringField2;
205 
206         actual = empty2.unescape();
207         CPPUNIT_ASSERT_EQUAL(expected, actual);
208 
209         // Escape
210         yapet::CSVStringField csvStringField3{"Test,field"};
211         yapet::CSVStringField empty3{csvStringField3};
212 
213         actual = empty3.escape();
214         expected = "\"Test,field\"";
215         CPPUNIT_ASSERT_EQUAL(expected, actual);
216 
217         yapet::CSVStringField csvStringField4{"Test,field"};
218         yapet::CSVStringField empty4;
219 
220         empty4 = csvStringField4;
221 
222         actual = empty4.escape();
223         CPPUNIT_ASSERT_EQUAL(expected, actual);
224     }
225 
copyPriorCall()226     void copyPriorCall() {
227         // Unescape
228         yapet::CSVStringField csvStringField{"\"test,\"\"field\""};
229         csvStringField.unescape();
230         yapet::CSVStringField empty{csvStringField};
231 
232         std::string actual = empty.unescape();
233         std::string expected{"test,\"field"};
234         CPPUNIT_ASSERT_EQUAL(expected, actual);
235 
236         yapet::CSVStringField csvStringField2{"\"test,\"\"field\""};
237         csvStringField2.unescape();
238         yapet::CSVStringField empty2{};
239 
240         empty2 = csvStringField2;
241 
242         actual = empty2.unescape();
243         CPPUNIT_ASSERT_EQUAL(expected, actual);
244 
245         // Escape
246         yapet::CSVStringField csvStringField3{"Test,field"};
247         csvStringField3.escape();
248         yapet::CSVStringField empty3{csvStringField3};
249 
250         actual = empty3.escape();
251         expected = "\"Test,field\"";
252         CPPUNIT_ASSERT_EQUAL(expected, actual);
253 
254         yapet::CSVStringField csvStringField4{"Test,field"};
255         csvStringField4.escape();
256         yapet::CSVStringField empty4;
257 
258         empty4 = csvStringField4;
259 
260         actual = empty4.escape();
261         CPPUNIT_ASSERT_EQUAL(expected, actual);
262     }
263 
moveNoPriorCall()264     void moveNoPriorCall() {
265         // Unescape
266         yapet::CSVStringField csvStringField{"\"test,\"\"field\""};
267         yapet::CSVStringField empty{std::move(csvStringField)};
268 
269         std::string actual = empty.unescape();
270         std::string expected{"test,\"field"};
271         CPPUNIT_ASSERT_EQUAL(expected, actual);
272 
273         yapet::CSVStringField csvStringField2{"\"test,\"\"field\""};
274         yapet::CSVStringField empty2{};
275 
276         empty2 = std::move(csvStringField2);
277 
278         actual = empty2.unescape();
279         CPPUNIT_ASSERT_EQUAL(expected, actual);
280 
281         // Escape
282         yapet::CSVStringField csvStringField3{"Test,field"};
283         yapet::CSVStringField empty3{std::move(csvStringField3)};
284 
285         actual = empty3.escape();
286         expected = "\"Test,field\"";
287         CPPUNIT_ASSERT_EQUAL(expected, actual);
288 
289         yapet::CSVStringField csvStringField4{"Test,field"};
290         yapet::CSVStringField empty4;
291 
292         empty4 = std::move(csvStringField4);
293 
294         actual = empty4.escape();
295         CPPUNIT_ASSERT_EQUAL(expected, actual);
296     }
297 
movePriorCall()298     void movePriorCall() {
299         // Unescape
300         yapet::CSVStringField csvStringField{"\"test,\"\"field\""};
301         csvStringField.unescape();
302         yapet::CSVStringField empty{std::move(csvStringField)};
303 
304         std::string actual = empty.unescape();
305         std::string expected{"test,\"field"};
306         CPPUNIT_ASSERT_EQUAL(expected, actual);
307 
308         yapet::CSVStringField csvStringField2{"\"test,\"\"field\""};
309         csvStringField2.unescape();
310         yapet::CSVStringField empty2{};
311 
312         empty2 = std::move(csvStringField2);
313 
314         actual = empty2.unescape();
315         CPPUNIT_ASSERT_EQUAL(expected, actual);
316 
317         // Escape
318         yapet::CSVStringField csvStringField3{"Test,field"};
319         csvStringField3.escape();
320         yapet::CSVStringField empty3{std::move(csvStringField3)};
321 
322         actual = empty3.escape();
323         expected = "\"Test,field\"";
324         CPPUNIT_ASSERT_EQUAL(expected, actual);
325 
326         yapet::CSVStringField csvStringField4{"Test,field"};
327         csvStringField4.escape();
328         yapet::CSVStringField empty4;
329 
330         empty4 = std::move(csvStringField4);
331 
332         actual = empty4.escape();
333         CPPUNIT_ASSERT_EQUAL(expected, actual);
334     }
335 };
336 
main()337 int main() {
338     CppUnit::TextUi::TestRunner runner;
339     runner.addTest(CSVStringFieldTest::suite());
340     return runner.run() ? 0 : 1;
341 }