eini_tests.erl 12.2 KB
Newer Older
Shunichi Shinohara's avatar
Shunichi Shinohara committed
1
2
3
4
5
6
-module(eini_tests).

-author('shino@accense.com').

-include_lib("eunit/include/eunit.hrl").

7
-import(eini, [parse/1]).
Shunichi Shinohara's avatar
Shunichi Shinohara committed
8
9
10
11
12
13
14
15
16
17
18
19

setup() ->
  ok.

teardown(_) ->
  ok.

empty_test_() ->
  {setup,
   fun setup/0,
   fun teardown/1,
   [
Shunichi Shinohara's avatar
Shunichi Shinohara committed
20
21
    ?_assertEqual({ok, []}, parse("")),
    ?_assertEqual({ok, []}, parse("\n"))
Shunichi Shinohara's avatar
Shunichi Shinohara committed
22
23
   ]}.

Shunichi Shinohara's avatar
Shunichi Shinohara committed
24
one_section_title_only_test_() ->
Shunichi Shinohara's avatar
Shunichi Shinohara committed
25
26
27
28
  {setup,
   fun setup/0,
   fun teardown/1,
   [
Shunichi Shinohara's avatar
Shunichi Shinohara committed
29
    %% Title only
Shunichi Shinohara's avatar
Shunichi Shinohara committed
30
    ?_assertEqual({ok, [
31
                        {title, []}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
32
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
33
                  parse(
34
                    "[title]\n"
Shunichi Shinohara's avatar
Shunichi Shinohara committed
35
                   )),
Shunichi Shinohara's avatar
Shunichi Shinohara committed
36
37
    %% Title only, but trailing spaces
    ?_assertEqual({ok, [
38
                        {title, []}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
39
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
40
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
41
42
                    "[title]  \n"
                   )),
Shunichi Shinohara's avatar
Shunichi Shinohara committed
43
44
    %% Title only, but comment lines
    ?_assertEqual({ok, [
45
                        {title, []}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
46
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
47
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
48
                    "; comment line\n"
Shunichi Shinohara's avatar
Shunichi Shinohara committed
49
50
51
52
                    "  \n"
                    "[title]\n"
                   )),
    ?_assertEqual({ok, [
53
                        {title, []}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
54
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
55
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
56
57
                    "; comment line\n"
                    "; comment line 2\n"
Shunichi Shinohara's avatar
Shunichi Shinohara committed
58
59
60
61
                    "  \n"
                    "[title]\n"
                   )),
    ?_assertEqual({ok, [
62
                        {title, []}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
63
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
64
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
65
66
                    "; comment line\n"
                    "; comment line 2\n"
Shunichi Shinohara's avatar
Shunichi Shinohara committed
67
68
69
70
                    "  \n"
                    "[title]\n"
                    "; comment after section title"
                   )),
Shunichi Shinohara's avatar
Shunichi Shinohara committed
71
72
    %% Title only, but preceding blank lines
    ?_assertEqual({ok, [
73
                        {title, []}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
74
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
75
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
76
77
78
79
                    "\n"
                    "  \n"
                    "[title]\n"
                   )),
80
    ?_assertEqual({ok, [
81
                        {title, []}
82
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
83
                  parse(
84
85
86
87
                    "  \n"
                    "\n"
                    "[title]\n"
                   )),
Shunichi Shinohara's avatar
Shunichi Shinohara committed
88
89
    %% Title only, but preceding blank lines and trailing spaces
    ?_assertEqual({ok, [
90
                        {title, []}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
91
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
92
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
93
94
95
96
97
98
                    "\n"
                    "  \n"
                    "[title]\t\s\n"
                   )),
    %% Title only, but trailing blank lines
    ?_assertEqual({ok, [
99
                        {title, []}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
100
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
101
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
102
103
104
105
106
107
108
                    "[title]\n"
                    "\n"
                    "  \n"
                    "\n"
                   )),
    %% Title only, but trailing spaces and trailing blank lines
    ?_assertEqual({ok, [
109
                        {title, []}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
110
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
111
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
112
113
114
115
116
117
                    "[title]  \n"
                    "\n"
                    "\n"
                   ))
   ]}.

Shunichi Shinohara's avatar
Shunichi Shinohara committed
118
119
120
121
122
123
one_section_title_only_syntax_error_test_() ->
  {setup,
   fun setup/0,
   fun teardown/1,
   [
    %% No ] char
124
    ?_assertMatch({error, {syntax_error, 1, _Reason}},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
125
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
126
127
128
129
                    "[title\n"
                   ))
   ]}.

Shunichi Shinohara's avatar
Shunichi Shinohara committed
130
131
132
133
134
135
one_section_title_and_one_prop_test_() ->
  {setup,
   fun setup/0,
   fun teardown/1,
   [
    %% Simple case
Shunichi Shinohara's avatar
Shunichi Shinohara committed
136
    ?_assertEqual({ok, [
137
                        {title, [{key1, <<"value1">>}]}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
138
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
139
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
140
141
142
                    "[title]\n"
                    "key1=value1\n"
                   )),
Shunichi Shinohara's avatar
Shunichi Shinohara committed
143
    %% title has trailing spaces
Shunichi Shinohara's avatar
Shunichi Shinohara committed
144
    ?_assertEqual({ok, [
145
                        {title, [{key1, <<"value1">>}]}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
146
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
147
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
148
                    "[title]  \n"
149
                    "key1=value1\n"
Shunichi Shinohara's avatar
Shunichi Shinohara committed
150
151
152
                   )),
    %% Single blank line between title and a prop
    ?_assertEqual({ok, [
153
                        {title, [{key1, <<"value1">>}]}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
154
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
155
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
156
157
158
159
                    "[title]  \n"
                    "\n"
                    "key1=value1\n"
                   )),
Shunichi Shinohara's avatar
Shunichi Shinohara committed
160
161
    %% Single comment line between title and a prop
    ?_assertEqual({ok, [
162
                        {title, [{key1, <<"value1">>}]}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
163
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
164
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
165
166
167
168
169
170
                    "[title]  \n"
                    "; comment\n"
                    "key1=value1\n"
                   )),
    %% Single comment line after a prop
    ?_assertEqual({ok, [
171
                        {title, [{key1, <<"value1">>}]}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
172
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
173
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
174
175
176
177
                    "[title]  \n"
                    "key1=value1\n"
                    "; comment\n"
                   )),
Shunichi Shinohara's avatar
Shunichi Shinohara committed
178
179
    %% Multi blank lines between title and a prop
    ?_assertEqual({ok, [
180
                        {title, [{key1, <<"value1">>}]}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
181
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
182
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
183
184
185
186
187
188
189
190
                    "[title]  \n"
                    "\n"
                    "    \n"
                    "\n"
                    "key1=value1\n"
                   )),
    %% Multi blank lines after a prop
    ?_assertEqual({ok, [
191
192
                        {title, 
                         [{key1, <<"value1">>}]}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
193
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
194
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
195
196
197
198
199
200
201
202
203
                    "[title]  \n"
                    "key1=value1\n"
                    "\n"
                    "    \n"
                    "\n"
                   )),
    %% Multi blank lines between title and a prop and
    %% multi blank lines after a prop
    ?_assertEqual({ok, [
204
                        {title, [{key1, <<"value1">>}]}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
205
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
206
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
207
208
209
210
211
212
213
214
215
216
217
218
                    "[title]  \n"
                    "\n"
                    "    \n"
                    "\n"
                    "key1=value1\n"
                    "\n"
                    "    \n"
                    "\n"
                   )),

    %% value has [ char
    ?_assertEqual({ok, [
219
                        {title, [{key1, <<"va[lue1">>}]}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
220
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
221
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
222
223
224
225
226
                    "[title]  \n"
                    "key1=va[lue1\n"
                   )),
    %% value has ] char
    ?_assertEqual({ok, [
227
                        {title, [{key1, <<"valu]e1">>}]}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
228
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
229
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
230
231
232
233
234
                    "[title]  \n"
                    "key1=valu]e1\n"
                   )),
    %% value has [ and ] chars
    ?_assertEqual({ok, [
235
                        {title, [{key1, <<"va[lu]e1">>}]}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
236
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
237
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
238
239
240
241
242
                    "[title]  \n"
                    "key1=va[lu]e1\n"
                   )),
    %% value has ; char
    ?_assertEqual({ok, [
243
                        {title, [{key1, <<"value1;continue">>}]}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
244
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
245
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
246
247
                    "[title]  \n"
                    "key1=value1;continue\n"
248
249
250
                   )),
    %% key has trailing spaces
    ?_assertEqual({ok, [
251
                        {title, [{key1, <<"value1">>}]}
252
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
253
                  parse(
254
255
256
257
258
                    "[title]  \n"
                    "key1   =value1\n"
                   )),
    %% value has preceding and trailing spaces
    ?_assertEqual({ok, [
259
                        {title, [{key1, <<"value1">>}]}
260
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
261
                  parse(
262
263
264
265
266
                    "[title]  \n"
                    "key1=  value1  \n"
                   )),
    %% value has characters which can not used in titles or keys
    ?_assertEqual({ok, [
267
                        {title, [{key1, <<"value1$% '""#!+*=@/:+">>}]}
268
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
269
                  parse(
270
271
                    "[title]\n"
                    "key1=value1$% '""#!+*=@/:+\n"
Shunichi Shinohara's avatar
Shunichi Shinohara committed
272
273
274
275
276
277
278
279
280
281
                   ))
   ]}.

one_section_title_and_two_props_test_() ->
  {setup,
   fun setup/0,
   fun teardown/1,
   [
    %% Simple case
    ?_assertEqual({ok, [
282
283
284
                        {title,
                         [{key1, <<"value1">>},
                          {key2, <<"value2">>}]}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
285
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
286
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
287
288
289
290
291
292
                    "[title]\n"
                    "key1=value1\n"
                    "key2=value2\n"
                   )),
    %% Blank lines
    ?_assertEqual({ok, [
293
294
295
                        {title,
                         [{key1, <<"value1">>},
                          {key2, <<"value2">>}]}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
296
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
297
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
298
299
300
301
302
303
304
305
                    "[title]\n"
                    "\n"
                    "key1=value1\n"
                    "  \n"
                    "\n"
                    "key2=value2\n"
                    "\n"
                    "\n"
306
                   ))
Shunichi Shinohara's avatar
Shunichi Shinohara committed
307
308
   ]}.

Shunichi Shinohara's avatar
Shunichi Shinohara committed
309
310
311
312
313
314
two_section_test_() ->
  {setup,
   fun setup/0,
   fun teardown/1,
   [
    ?_assertEqual({ok, [
315
316
                        {titleA, []},
                        {titleB, []}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
317
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
318
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
319
320
321
322
                    "[titleA]\n"
                    "[titleB]\n"
                   )),
    ?_assertEqual({ok, [
323
324
325
326
                        {titleA,
                         [{keyA1, <<"valueA1">>}]},
                        {titleB,
                         [{keyB1, <<"valueB1">>}]}
Shunichi Shinohara's avatar
Shunichi Shinohara committed
327
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
328
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
329
330
331
332
333
334
335
                    "[titleA]\n"
                    "keyA1=valueA1\n"
                    "[titleB]  \n"
                    "keyB1=valueB1\n"
                   ))
   ]}.

336
337
338
339
340
341
342
343
344
binary_two_section_test_() ->
  {setup,
   fun setup/0,
   fun teardown/1,
   [
    ?_assertEqual({ok, [
                        {titleA, []},
                        {titleB, []}
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
345
                  parse(
346
347
348
349
350
351
352
353
354
                    "[titleA]\n"
                    "[titleB]\n"
                   )),
    ?_assertEqual({ok, [
                        {titleA,
                         [{keyA1, <<"valueA1">>}]},
                        {titleB,
                         [{keyB1, <<"valueB1">>}]}
                       ]},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
355
                  parse(
356
357
358
359
360
361
362
                    <<"[titleA]\n"
                      "keyA1=valueA1\n"
                      "[titleB]  \n"
                      "keyB1=valueB1\n">>
                   ))
   ]}.

363
364
365
366
367
lex_error_title_test_() ->
  {setup,
   fun setup/0,
   fun teardown/ 1,
   [
368
369
    %% セクションタイトルの中に vertical tab
    ?_assertMatch({error, {illegal_character, 1, _Reason}},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
370
                  parse("[ti\vtle]")),
371
    ?_assertMatch({error, {illegal_character, 3, _Reason}},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
372
                  parse(
373
374
                    "[titleA]\n"
                    "keyA1=valueA1\n"
375
                    "[tit\vleB]  \n"
376
377
378
379
380
                    "keyB1=valueB1\n"
                   ))
   ]}.
  
syntax_error_title_test_() ->
Shunichi Shinohara's avatar
Shunichi Shinohara committed
381
382
383
384
385
  {setup,
   fun setup/0,
   fun teardown/1,
   [
    %% セクションタイトルの前に空白
386
    ?_assertMatch({error, {syntax_error, 1, ["syntax error before: ", _]}},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
387
                  parse("  [title]")),
388
389
    %% セクションタイトルの中に空白
    ?_assertMatch({error, {syntax_error, 3, _Reason}},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
390
                  parse(
391
392
393
394
395
                    "[titleA]\n"
                    "keyA1=valueA1\n"
                    "[tit  leB]\n"
                    "keyB1=valueB1\n"
                   ))
Shunichi Shinohara's avatar
Shunichi Shinohara committed
396
397
   ]}.
  
Shunichi Shinohara's avatar
Shunichi Shinohara committed
398
399
400
401
402
dup_title_test_() ->
  {setup,
   fun setup/0,
   fun teardown/ 1,
   [
403
    ?_assertEqual({error, {duplicate_title, titleA}},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
404
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
405
406
407
408
409
410
411
412
413
414
415
416
                    "[titleA]\n"
                    "keyA1=valueA1\n"
                    "[titleA]  \n"
                    "keyB1=valueB1\n"
                   ))
   ]}.
  
dup_key_test_() ->
  {setup,
   fun setup/0,
   fun teardown/ 1,
   [
417
    ?_assertEqual({error, {duplicate_key, titleB, key2}},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
418
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
419
420
421
422
423
424
425
426
                    "[titleA]\n"
                    "key1=value1\n"
                    "[titleB]  \n"
                    "key1=value1\n"
                    "key2=value2\n"
                    "key3=value3\n"
                    "key2=value4\n"
                   )),
427
    ?_assertEqual({error, {duplicate_key, titleB, key2}},
Shunichi Shinohara's avatar
Shunichi Shinohara committed
428
                  parse(
Shunichi Shinohara's avatar
Shunichi Shinohara committed
429
430
431
432
433
434
435
436
437
                    "[titleA]\n"
                    "key1=value1\n"
                    "[titleB]  \n"
                    "key1=value1\n"
                    "key2=value2\n"
                    "key3=value3\n"
                    "key2  =  value4\n"
                   ))
   ]}.