anbt-sql-formatter 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,17 @@
1
+ require "test/unit"
2
+ require "pp"
3
+
4
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), "..", "lib")
5
+
6
+ class Helper
7
+ def Helper.format_tokens(list)
8
+ list.map{|token|
9
+ "<#{token._type}>#{token.string}</>"
10
+ }.join("\n")
11
+ end
12
+ end
13
+
14
+
15
+ def assert_equals(a,b,c)
16
+ assert_equal(b,c,a)
17
+ end
@@ -0,0 +1,360 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require File.join(File.expand_path(File.dirname(__FILE__)), "helper")
4
+
5
+ require "anbt-sql-formatter/coarse-tokenizer"
6
+
7
+ class CoarseTokenizer
8
+ attr_accessor :buf, :str, :result
9
+ end
10
+
11
+
12
+ def format(tokens)
13
+ tokens.map{|t| t.to_s }.join("\n")
14
+ end
15
+
16
+
17
+ class TestCoarseTokenizer < Test::Unit::TestCase
18
+ def setup
19
+ @tok = CoarseTokenizer.new
20
+ end
21
+
22
+
23
+ def test_shift_to_buf
24
+ @tok.buf = ""
25
+ @tok.str = "abcdefg"
26
+
27
+ msg = "shift_to_buf - "
28
+ @tok.shift_to_buf(1)
29
+ assert_equals( msg, "a", @tok.buf )
30
+ assert_equals( msg, "bcdefg", @tok.str )
31
+
32
+ @tok.shift_to_buf(2)
33
+ assert_equals( msg, "abc", @tok.buf )
34
+ assert_equals( msg, "defg", @tok.str )
35
+ end
36
+
37
+
38
+ def test_shift_token
39
+ @tok.result = []
40
+ @tok.buf = "ABC"
41
+ @tok.str = "'def'"
42
+
43
+ msg = "shift_token - "
44
+ @tok.shift_token(1, :plain, :comment, :start)
45
+ assert_equals( msg, :plain, @tok.result.last._type)
46
+ assert_equals( msg, "ABC", @tok.result.last.string)
47
+ assert_equals( msg, "'", @tok.buf)
48
+ assert_equals( msg, "def'", @tok.str)
49
+
50
+ @tok.result = []
51
+ @tok.buf = "'ABC"
52
+ @tok.str = "'def"
53
+
54
+ @tok.shift_token(1, :comment, :plain, :end)
55
+ assert_equals( msg, :comment, @tok.result.last._type)
56
+ assert_equals( msg, "'ABC'", @tok.result.last.string)
57
+ assert_equals( msg, "", @tok.buf)
58
+ assert_equals( msg, "def", @tok.str)
59
+ end
60
+
61
+
62
+ def test_tokenize
63
+ msg = "tokenize - "
64
+
65
+ assert_equals( msg, (<<EOB
66
+ <plain>aa</>
67
+ EOB
68
+ ).chomp,
69
+ format(@tok.tokenize((<<EOB
70
+ aa
71
+ EOB
72
+ ).chomp))
73
+ )
74
+
75
+ ########
76
+ assert_equals( msg, (<<EOB
77
+ <plain>aa </>
78
+ <quote_double>"bb"</>
79
+ EOB
80
+ ).chomp,
81
+ format(@tok.tokenize((<<EOB
82
+ aa "bb"
83
+ EOB
84
+ ).chomp))
85
+ )
86
+
87
+ ########
88
+ assert_equals( msg, (<<EOB
89
+ <plain>aa </>
90
+ <quote_single>'bb'</>
91
+ EOB
92
+ ).chomp,
93
+ format(@tok.tokenize((<<EOB
94
+ aa 'bb'
95
+ EOB
96
+ ).chomp))
97
+ )
98
+
99
+ ########
100
+ assert_equals( msg, (<<EOB
101
+ <plain>aa </>
102
+ <comment_single>--bb<br></>
103
+ <plain>cc</>
104
+ EOB
105
+ ).chomp,
106
+ format(@tok.tokenize((<<EOB
107
+ aa --bb
108
+ cc
109
+ EOB
110
+ ).chomp))
111
+ )
112
+
113
+ ########
114
+ assert_equals( msg, (<<EOB
115
+ <plain>aa </>
116
+ <comment_multi>/* bb */</>
117
+ <plain> cc</>
118
+ EOB
119
+ ).chomp,
120
+ format(@tok.tokenize((<<EOB
121
+ aa /* bb */ cc
122
+ EOB
123
+ ).chomp))
124
+ )
125
+
126
+ ########
127
+ assert_equals( msg + "begin with multiline comment", (<<EOB
128
+ <comment_multi>/* bb */</>
129
+ <plain> cc</>
130
+ EOB
131
+ ).chomp,
132
+ format(@tok.tokenize((<<EOB
133
+ /* bb */ cc
134
+ EOB
135
+ ).chomp))
136
+ )
137
+ end
138
+
139
+
140
+ def test_string_in_string
141
+ msg = "string_in_string"
142
+
143
+ ########
144
+ assert_equals( msg, (<<EOB
145
+ <quote_double>"aa'bb'cc"</>
146
+ EOB
147
+ ).chomp,
148
+ format(@tok.tokenize((<<EOB
149
+ "aa'bb'cc"
150
+ EOB
151
+ ).chomp))
152
+ )
153
+
154
+ ########
155
+ assert_equals( msg, (<<EOB
156
+ <quote_single>'aa"bb"cc'</>
157
+ EOB
158
+ ).chomp,
159
+ format(@tok.tokenize((<<EOB
160
+ 'aa"bb"cc'
161
+ EOB
162
+ ).chomp))
163
+ )
164
+ end
165
+
166
+
167
+ def test_comment_in_comment
168
+ msg = "comment_in_comment - "
169
+ ########
170
+ assert_equals( msg, (<<EOB
171
+ <comment_single>--a--b</>
172
+ EOB
173
+ ).chomp,
174
+ format(@tok.tokenize((<<EOB
175
+ --a--b
176
+ EOB
177
+ ).chomp))
178
+ )
179
+
180
+ ########
181
+ assert_equals( msg, (<<EOB
182
+ <comment_single>-- aa /* bb */</>
183
+ EOB
184
+ ).chomp,
185
+ format(@tok.tokenize((<<EOB
186
+ -- aa /* bb */
187
+ EOB
188
+ ).chomp))
189
+ )
190
+
191
+ ########
192
+ assert_equals( msg, (<<EOB
193
+ <comment_multi>/* aa /* bb */</>
194
+ EOB
195
+ ).chomp,
196
+ format(@tok.tokenize((<<EOB
197
+ /* aa /* bb */
198
+ EOB
199
+ ).chomp))
200
+ )
201
+
202
+ ########
203
+ assert_equals( msg, (<<EOB
204
+ <comment_single>-- aa /* bb */</>
205
+ EOB
206
+ ).chomp,
207
+ format(@tok.tokenize((<<EOB
208
+ -- aa /* bb */
209
+ EOB
210
+ ).chomp))
211
+ )
212
+ end
213
+
214
+
215
+ def test_string_in_comment
216
+ msg = "string_in_comment - "
217
+
218
+ ########
219
+ assert_equals( msg, (<<EOB
220
+ <comment_single>-- aa "bb" cc</>
221
+ EOB
222
+ ).chomp,
223
+ format(@tok.tokenize((<<EOB
224
+ -- aa "bb" cc
225
+ EOB
226
+ ).chomp))
227
+ )
228
+
229
+ ########
230
+ assert_equals( msg, (<<EOB
231
+ <comment_single>-- aa 'bb' cc</>
232
+ EOB
233
+ ).chomp,
234
+ format(@tok.tokenize((<<EOB
235
+ -- aa 'bb' cc
236
+ EOB
237
+ ).chomp))
238
+ )
239
+
240
+ ########
241
+ assert_equals( msg, (<<EOB
242
+ <comment_multi>/* aa "bb" cc */</>
243
+ EOB
244
+ ).chomp,
245
+ format(@tok.tokenize((<<EOB
246
+ /* aa "bb" cc */
247
+ EOB
248
+ ).chomp))
249
+ )
250
+
251
+ ########
252
+ assert_equals( msg, (<<EOB
253
+ <comment_multi>/* aa 'bb' cc */</>
254
+ EOB
255
+ ).chomp,
256
+ format(@tok.tokenize((<<EOB
257
+ /* aa 'bb' cc */
258
+ EOB
259
+ ).chomp))
260
+ )
261
+ end
262
+
263
+
264
+ def test_comment_in_string
265
+ msg = "comment_in_string - "
266
+
267
+ ########
268
+ assert_equals( msg + "comment_single in quote_single", (<<EOB
269
+ <quote_single>'aa--bb'</>
270
+ EOB
271
+ ).chomp,
272
+ format(@tok.tokenize((<<EOB
273
+ 'aa--bb'
274
+ EOB
275
+ ).chomp))
276
+ )
277
+
278
+ ########
279
+ assert_equals( msg + "comment_single in quote_double", (<<EOB
280
+ <quote_double>"aa--bb"</>
281
+ EOB
282
+ ).chomp,
283
+ format(@tok.tokenize((<<EOB
284
+ "aa--bb"
285
+ EOB
286
+ ).chomp))
287
+ )
288
+
289
+ ########
290
+ assert_equals( msg + "comment_multi in quote_double", (<<EOB
291
+ <quote_double>"aa /* bb */ cc"</>
292
+ EOB
293
+ ).chomp,
294
+ format(@tok.tokenize((<<EOB
295
+ "aa /* bb */ cc"
296
+ EOB
297
+ ).chomp))
298
+ )
299
+
300
+ ########
301
+ assert_equals( msg + "comment_multi in quote_double", (<<EOB
302
+ <quote_single>'aa /* bb */ cc'</>
303
+ EOB
304
+ ).chomp,
305
+ format(@tok.tokenize((<<EOB
306
+ 'aa /* bb */ cc'
307
+ EOB
308
+ ).chomp))
309
+ )
310
+ end
311
+
312
+
313
+ def test_string_escape
314
+ msg = "string_escape"
315
+
316
+ ########
317
+ assert_equals( msg, (<<EOB
318
+ <quote_double>"_a_\\\\_b_<br>_c_\\'_d_"</>
319
+ EOB
320
+ ).chomp,
321
+ format(@tok.tokenize((<<EOB
322
+ "_a_\\\\_b_\n_c_\\'_d_"
323
+ EOB
324
+ ).chomp))
325
+ )
326
+
327
+ ########
328
+ assert_equals( msg, (<<EOB
329
+ <quote_single>'_a_\\\\_b_<br>_c_\\'_d_'</>
330
+ EOB
331
+ ).chomp,
332
+ format(@tok.tokenize((<<EOB
333
+ '_a_\\\\_b_\n_c_\\'_d_'
334
+ EOB
335
+ ).chomp))
336
+ )
337
+
338
+ ########
339
+ assert_equals( msg, (<<EOB
340
+ <quote_double>"_a_""_b_"</>
341
+ EOB
342
+ ).chomp,
343
+ format(@tok.tokenize((<<EOB
344
+ "_a_""_b_"
345
+ EOB
346
+ ).chomp))
347
+ )
348
+
349
+ ########
350
+ assert_equals( msg, (<<EOB
351
+ <quote_single>'_a_''_b_'</>
352
+ EOB
353
+ ).chomp,
354
+ format(@tok.tokenize((<<EOB
355
+ '_a_''_b_'
356
+ EOB
357
+ ).chomp))
358
+ )
359
+ end
360
+ end
@@ -0,0 +1,489 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require File.join(File.expand_path(File.dirname(__FILE__)), "helper")
4
+
5
+ require "anbt-sql-formatter/formatter"
6
+
7
+
8
+ class TestAnbtSqlFormatter < Test::Unit::TestCase
9
+ INDENT_STR = "<-indent->"
10
+
11
+ def setup
12
+ @rule = AnbtSql::Rule.new
13
+ @rule.indent_string = INDENT_STR
14
+ @parser = AnbtSql::Parser.new(@rule)
15
+
16
+ @fmt = AnbtSql::Formatter.new(@rule)
17
+ end
18
+
19
+
20
+ def test_modify_keyword_case
21
+ msg = "upcase"
22
+
23
+ ########
24
+ @rule.keyword = AnbtSql::Rule::KEYWORD_UPPER_CASE
25
+
26
+ tokens = @parser.parse("select")
27
+ @fmt.modify_keyword_case(tokens)
28
+ assert_equals( msg + "", (<<EOB
29
+ <keyword>SELECT</>
30
+ EOB
31
+ ).chop,
32
+ Helper.format_tokens(tokens)
33
+ )
34
+
35
+ ########
36
+ msg = "downcase"
37
+ @rule.keyword = AnbtSql::Rule::KEYWORD_LOWER_CASE
38
+
39
+ tokens = @parser.parse("SELECT")
40
+ @fmt.modify_keyword_case(tokens)
41
+ assert_equals( msg + "", (<<EOB
42
+ <keyword>select</>
43
+ EOB
44
+ ).chop,
45
+ Helper.format_tokens(tokens)
46
+ )
47
+ end
48
+
49
+
50
+ def test_concat_operator_for_oracle
51
+ msg = "concat_operator_for_oracle - "
52
+
53
+ ########
54
+ tokens = @parser.parse("a+")
55
+ @fmt.concat_operator_for_oracle(tokens)
56
+ assert_equals( msg + "length is less than 3, should do nothing",
57
+ (<<EOB
58
+ <name>a</>
59
+ <symbol>+</>
60
+ EOB
61
+ ).chop,
62
+ Helper.format_tokens(tokens)
63
+ )
64
+
65
+ ########
66
+ tokens = @parser.parse("(+)")
67
+ @fmt.concat_operator_for_oracle(tokens)
68
+ assert_equals( msg + "", (<<EOB
69
+ <symbol>(+)</>
70
+ EOB
71
+ ).chop,
72
+ Helper.format_tokens(tokens)
73
+ )
74
+
75
+ ########
76
+ tokens = @parser.parse("(+)")
77
+ tokens = @fmt.format_list(tokens)
78
+ assert_equals( msg + "format_list()", (<<EOB
79
+ <symbol>(+)</>
80
+ EOB
81
+ ).chop,
82
+ Helper.format_tokens(tokens)
83
+ )
84
+ end
85
+
86
+
87
+ def test_remove_symbol_side_space
88
+ msg = "remove_symbol_side_space - "
89
+
90
+ ########
91
+ tokens = @parser.parse("a (b")
92
+ @fmt.remove_symbol_side_space(tokens)
93
+ assert_equals( msg + "", (<<EOB
94
+ <name>a</>
95
+ <symbol>(</>
96
+ <name>b</>
97
+ EOB
98
+ ).chop,
99
+ Helper.format_tokens(tokens)
100
+ )
101
+
102
+
103
+ ########
104
+ tokens = @parser.parse("a( b")
105
+ @fmt.remove_symbol_side_space(tokens)
106
+ assert_equals( msg + "", (<<EOB
107
+ <name>a</>
108
+ <symbol>(</>
109
+ <name>b</>
110
+ EOB
111
+ ).chop,
112
+ Helper.format_tokens(tokens)
113
+ )
114
+
115
+
116
+ ########
117
+ tokens = @parser.parse("a ( b")
118
+ @fmt.remove_symbol_side_space(tokens)
119
+ assert_equals( msg + "", (<<EOB
120
+ <name>a</>
121
+ <symbol>(</>
122
+ <name>b</>
123
+ EOB
124
+ ).chop,
125
+ Helper.format_tokens(tokens)
126
+ )
127
+ end
128
+
129
+
130
+ def test_special_treatment_for_parenthesis_with_one_element
131
+ msg = "special_treatment_for_parenthesis_with_one_element - "
132
+
133
+ ########
134
+ tokens = @parser.parse("( 1 )")
135
+ @fmt.special_treatment_for_parenthesis_with_one_element(tokens)
136
+ assert_equals( msg + "one element, should not separate", (<<EOB
137
+ <symbol>(1)</>
138
+ EOB
139
+ ).chop,
140
+ Helper.format_tokens(tokens)
141
+ )
142
+
143
+
144
+ ########
145
+ tokens = @parser.parse("(1,2)")
146
+ @fmt.special_treatment_for_parenthesis_with_one_element(tokens)
147
+ assert_equals( msg + "more than one element, should separate", (<<EOB
148
+ <symbol>(</>
149
+ <value>1</>
150
+ <symbol>,</>
151
+ <value>2</>
152
+ <symbol>)</>
153
+ EOB
154
+ ).chop,
155
+ Helper.format_tokens(tokens)
156
+ )
157
+ end
158
+
159
+
160
+ def test_insert_space_between_tokens
161
+ msg = "insert_space_between_tokens - "
162
+
163
+ ########
164
+ tokens = @parser.parse("a=")
165
+ @fmt.insert_space_between_tokens(tokens)
166
+ assert_equals(msg, (<<EOB
167
+ <name>a</>
168
+ <space> </>
169
+ <symbol>=</>
170
+ EOB
171
+ ).chop,
172
+ Helper.format_tokens(tokens)
173
+ )
174
+
175
+ ########
176
+ tokens = @parser.parse("=b")
177
+ @fmt.insert_space_between_tokens(tokens)
178
+ assert_equals(msg, (<<EOB
179
+ <symbol>=</>
180
+ <space> </>
181
+ <name>b</>
182
+ EOB
183
+ ).chop,
184
+ Helper.format_tokens(tokens)
185
+ )
186
+ end
187
+
188
+
189
+ def test_insert_return_and_indent
190
+ msg = "insert_return_and_indent - "
191
+
192
+ ########
193
+ tokens = @parser.parse("foo bar")
194
+
195
+ index, indent_depth = 1, 1
196
+
197
+ assert_equals( msg + "before", (<<EOB
198
+ <name>foo</>
199
+ <space> </>
200
+ <name>bar</>
201
+ EOB
202
+ ).chop,
203
+ Helper.format_tokens(tokens)
204
+ )
205
+
206
+ result = @fmt.insert_return_and_indent(tokens, index, indent_depth)
207
+
208
+ assert_equals( msg + "index: #{index} / indent depth: #{indent_depth}",
209
+ (<<EOB
210
+ <name>foo</>
211
+ <space>\n#{INDENT_STR}</>
212
+ <name>bar</>
213
+ EOB
214
+ ).chop,
215
+ Helper.format_tokens(tokens)
216
+ )
217
+
218
+ ########
219
+ # msg = "" #"後の空白を置き換え"
220
+ tokens = @parser.parse("select foo")
221
+
222
+ index, indent_depth = 1, 1
223
+
224
+ assert_equals( msg + "before", (<<EOB
225
+ <keyword>select</>
226
+ <space> </>
227
+ <name>foo</>
228
+ EOB
229
+ ).chop,
230
+ Helper.format_tokens(tokens)
231
+ )
232
+
233
+ result = @fmt.insert_return_and_indent(tokens, index, indent_depth)
234
+
235
+ assert_equals( msg + "#{msg}: index: #{index} / indent depth: #{indent_depth}",
236
+ (<<EOB
237
+ <keyword>select</>
238
+ <space>\n#{INDENT_STR}</>
239
+ <name>foo</>
240
+ EOB
241
+ ).chop,
242
+ Helper.format_tokens(tokens)
243
+ )
244
+
245
+ ########
246
+ msg = "" #"前の空白を置き換え"
247
+ tokens = @parser.parse("select foo")
248
+ index, indent_depth = 2, 1
249
+
250
+ assert_equals( msg + "before", (<<EOB
251
+ <keyword>select</>
252
+ <space> </>
253
+ <name>foo</>
254
+ EOB
255
+ ).chop,
256
+ Helper.format_tokens(tokens)
257
+ )
258
+
259
+ result = @fmt.insert_return_and_indent(tokens, index, indent_depth)
260
+ assert_equals( msg + "", 0, result)
261
+
262
+ assert_equals( msg + "#{msg}: index: #{index} / indent depth: #{indent_depth}",
263
+ (<<EOB
264
+ <keyword>select</>
265
+ <space>\n#{INDENT_STR}</>
266
+ <name>foo</>
267
+ EOB
268
+ ).chop,
269
+ Helper.format_tokens(tokens)
270
+ )
271
+
272
+ ########
273
+ msg = "indent depth = 2"
274
+ tokens = @parser.parse("foo bar")
275
+ index, indent_depth = 1, 2
276
+
277
+ assert_equals( msg + "before", (<<EOB
278
+ <name>foo</>
279
+ <space> </>
280
+ <name>bar</>
281
+ EOB
282
+ ).chop,
283
+ Helper.format_tokens(tokens)
284
+ )
285
+
286
+ result = @fmt.insert_return_and_indent(tokens, index, indent_depth)
287
+
288
+ assert_equals( msg + "#{msg}: index: #{index} / indent depth: #{indent_depth}",
289
+ (<<EOB
290
+ <name>foo</>
291
+ <space>\n#{INDENT_STR}#{INDENT_STR}</>
292
+ <name>bar</>
293
+ EOB
294
+ ).chop,
295
+ Helper.format_tokens(tokens)
296
+ )
297
+
298
+ ########
299
+ msg = "kw, nl, kw"
300
+ tokens = @parser.parse("select\ncase")
301
+
302
+ assert_equals( msg + "", (<<EOB
303
+ <keyword>select</>
304
+ <space>\n</>
305
+ <keyword>case</>
306
+ EOB
307
+ ).chop,
308
+ Helper.format_tokens(tokens)
309
+ )
310
+
311
+ ########
312
+ =begin
313
+ msg = "FROM の前で改行"
314
+
315
+ assert_equals( msg + "", (<<EOB
316
+ SELECT
317
+ <-indent-><-indent->aa
318
+ <-indent-><-indent->,bb
319
+ <-indent-><-indent->,cc
320
+ <-indent-><-indent->,dd
321
+ <-indent-><-indent->,ee
322
+ <-indent->FROM
323
+ <-indent-><-indent->foo
324
+ ;
325
+ EOB
326
+ ).chop,
327
+ # Helper.format_tokens(tokens),
328
+ @fmt.format("SELECT aa ,bb ,cc ,dd ,ee FROM foo;"),
329
+ "#{msg}")
330
+ =end
331
+
332
+ # ########
333
+ # msg = "指定した index に対して tokens[index] が存在するので 1 を返すべき"
334
+ # 間違い。tokens[index] が存在していても 1 を返すとは限らない。
335
+ # tokens = parser.parse("foo bar")
336
+ # #pp tokens
337
+ # index = 1
338
+ # result = @fmt.insert_return_and_indent(tokens, index, 1)
339
+
340
+ # assert_equals( msg + "", 1, result, msg)
341
+
342
+ ########
343
+ msg = "指定した index に対して tokens[index] が存在しないので 0 を返すべき"
344
+ tokens = @parser.parse("foo bar")
345
+
346
+ index = 10
347
+ result = @fmt.insert_return_and_indent(tokens, index, 1)
348
+
349
+ assert_equals( msg + "", 0, result)
350
+ end ## insert_return_and_indent
351
+
352
+
353
+ def test_format
354
+ msg = "format - "
355
+
356
+ ########
357
+ func_name = "TEST_FUNCTION"
358
+ @rule.function_names << func_name
359
+
360
+ assert_equals( msg + "function with parenthesis", (<<EOB
361
+ SELECT
362
+ <-indent-><-indent->#{func_name}( * )
363
+ EOB
364
+ ).chop,
365
+ @fmt.format("select #{func_name}(*)")
366
+ )
367
+
368
+ @rule.function_names.delete func_name
369
+
370
+ ########
371
+ assert_equals( msg + "Next line of single commnet", (<<EOB
372
+ SELECT
373
+ <-indent-><-indent->-- comment
374
+ <-indent-><-indent->name
375
+ EOB
376
+ ).chop,
377
+ @fmt.format(<<EOB
378
+ select
379
+ -- comment
380
+ name
381
+ EOB
382
+ )
383
+ )
384
+
385
+ ########
386
+ assert_equals( msg + "new line after single line comment",
387
+ (<<EOB
388
+ --a
389
+ b
390
+ EOB
391
+ ).chop,
392
+ @fmt.format(<<EOB
393
+ --a
394
+ b
395
+ EOB
396
+ )
397
+ );
398
+
399
+ ########
400
+ assert_equals( msg + "two line breaks after semicolon",
401
+ (<<EOB
402
+ a
403
+ ;
404
+
405
+ b
406
+ EOB
407
+ ).chop,
408
+ @fmt.format(<<EOB
409
+ a;b
410
+ EOB
411
+ )
412
+ );
413
+
414
+ ########
415
+ assert_equals( msg + "two line breaks after semicolon",
416
+ (<<EOB
417
+ a
418
+ ;
419
+ EOB
420
+ ).chop,
421
+ @fmt.format("a;")
422
+ );
423
+ end
424
+
425
+
426
+ def test_split_by_semicolon
427
+ msg = "split_by_semicolon - "
428
+
429
+ ########
430
+ tokens = @parser.parse("a;b")
431
+
432
+ assert_equals( msg + "first statement",
433
+ "a",
434
+ @fmt.split_by_semicolon(tokens)[0][0].string
435
+ )
436
+ assert_equals( msg + "second statement",
437
+ "b",
438
+ @fmt.split_by_semicolon(tokens)[1][0].string
439
+ )
440
+
441
+ ########
442
+ tokens = @parser.parse(";")
443
+ statements = @fmt.split_by_semicolon(tokens)
444
+ assert_equals( msg,
445
+ [],
446
+ statements[0]
447
+ )
448
+ assert_equals( msg,
449
+ [],
450
+ statements[1]
451
+ )
452
+
453
+ ########
454
+ tokens = @parser.parse("a;")
455
+ statements = @fmt.split_by_semicolon(tokens)
456
+ assert_equals( msg,
457
+ "<name>a</>",
458
+ Helper.format_tokens( statements[0] )
459
+ )
460
+ assert_equals( msg,
461
+ [],
462
+ statements[1]
463
+ )
464
+
465
+ ########
466
+ tokens = @parser.parse(";a")
467
+ statements = @fmt.split_by_semicolon(tokens)
468
+ assert_equals( msg,
469
+ [],
470
+ statements[0]
471
+ )
472
+ assert_equals( msg,
473
+ "<name>a</>",
474
+ Helper.format_tokens( statements[1] )
475
+ )
476
+
477
+ ########
478
+ tokens = @parser.parse("a;b")
479
+ statements = @fmt.split_by_semicolon(tokens)
480
+ assert_equals( msg,
481
+ "<name>a</>",
482
+ Helper.format_tokens( statements[0] )
483
+ )
484
+ assert_equals( msg,
485
+ "<name>b</>",
486
+ Helper.format_tokens( statements[1] )
487
+ )
488
+ end
489
+ end