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 }