erubis 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,229 @@
1
+ ##
2
+ ## $Rev: 3 $
3
+ ## $Release: 1.0.0 $
4
+ ## $Date: 2006-01-31 12:54:23 +0900 (Tue, 31 Jan 2006) $
5
+ ##
6
+
7
+ testdir = File.dirname(File.expand_path(__FILE__))
8
+ libdir = File.dirname(testdir) + '/lib'
9
+ $: << testdir
10
+ $: << libdir
11
+
12
+ bindir = File.dirname(testdir) + '/bin'
13
+ $script = bindir + '/erubis'
14
+ if test(?f, 'bin/erubis')
15
+ $script = 'bin/erubis'
16
+ elsif test(?f, '../bin/erubis')
17
+ $script = '../bin/erubis'
18
+ end
19
+
20
+
21
+ require 'test/unit'
22
+ #require 'test/unit/ui/console/testrunner'
23
+ require 'assert-diff'
24
+ require 'yaml'
25
+ require 'tempfile'
26
+
27
+ require 'erubis'
28
+
29
+
30
+ class BinTest < Test::Unit::TestCase
31
+
32
+ INPUT = <<'END'
33
+ list:
34
+ <% list = ['<aaa>', 'b&b', '"ccc"']
35
+ for item in list %>
36
+ - <%= item %>
37
+ <% end %>
38
+ user: <%= defined?(user) ? user : "(none)" %>
39
+ END
40
+
41
+ SRC = <<'END'
42
+ _out = ''; _out << "list:\n"
43
+ list = ['<aaa>', 'b&b', '"ccc"']
44
+ for item in list
45
+ _out << " - "; _out << ( item ).to_s; _out << "\n"
46
+ end
47
+ _out << "user: "; _out << ( defined?(user) ? user : "(none)" ).to_s; _out << "\n"
48
+ _out
49
+ END
50
+
51
+ OUTPUT = <<'END'
52
+ list:
53
+ - <aaa>
54
+ - b&b
55
+ - "ccc"
56
+ user: (none)
57
+ END
58
+
59
+
60
+ def _test()
61
+ if @filename == nil
62
+ method = (caller[0] =~ /in `(.*)'/) && $1 #'
63
+ @filename = "tmp.#{method}"
64
+ end
65
+ File.open(@filename, 'w') { |f| f.write(@input) } if @filename
66
+ begin
67
+ command = "ruby #{$script} #{@options} #{@filename}"
68
+ output = `#{command}`
69
+ ensure
70
+ File.unlink(@filename) if @filename && test(?f, @filename)
71
+ end
72
+ assert_equal_with_diff(@expected, output)
73
+ end
74
+
75
+
76
+ def test_version
77
+ @options = '-v'
78
+ @expected = (("$Release: 1.0.0 $" =~ /[.\d]+/) && $&) + "\n"
79
+ @filename = false
80
+ _test()
81
+ end
82
+
83
+
84
+ def test_basic1
85
+ @input = INPUT
86
+ @expected = OUTPUT
87
+ @options = ''
88
+ _test()
89
+ end
90
+
91
+
92
+ def test_source1
93
+ @input = INPUT
94
+ @expected = SRC
95
+ @options = '-s'
96
+ _test()
97
+ end
98
+
99
+
100
+ def test_pattern1
101
+ @input = INPUT.gsub(/<%/, '<!--%').gsub(/%>/, '%-->')
102
+ @expected = OUTPUT
103
+ @options = "-p '<!--% %-->'"
104
+ _test()
105
+ end
106
+
107
+
108
+ def test_class1
109
+ @input = INPUT
110
+ @expected = OUTPUT.gsub(/<aaa>/, '&lt;aaa&gt;').gsub(/b&b/, 'b&amp;b').gsub(/"ccc"/, '&quot;ccc&quot;')
111
+ @options = "-c XmlEruby"
112
+ _test()
113
+ end
114
+
115
+
116
+ def test_notrim1
117
+ @input = INPUT
118
+ @expected = <<'END'
119
+ list:
120
+
121
+ - <aaa>
122
+
123
+ - b&b
124
+
125
+ - "ccc"
126
+
127
+ user: (none)
128
+ END
129
+ @options = "-T"
130
+ _test()
131
+ end
132
+
133
+
134
+ def test_notrim2
135
+ @input = INPUT
136
+ @expected = <<'END'
137
+ _out = ''; _out << "list:\n"
138
+ list = ['<aaa>', 'b&b', '"ccc"']
139
+ for item in list ; _out << "\n"
140
+ _out << " - "; _out << ( item ).to_s; _out << "\n"
141
+ end ; _out << "\n"
142
+ _out << "user: "; _out << ( defined?(user) ? user : "(none)" ).to_s; _out << "\n"
143
+ _out
144
+ END
145
+ @options = "-sT"
146
+ _test()
147
+ end
148
+
149
+
150
+ def test_context1
151
+ @input = INPUT
152
+ @expected = OUTPUT.gsub(/\(none\)/, 'Hello')
153
+ @options = '--user=Hello'
154
+ _test()
155
+ end
156
+
157
+
158
+ def test_yaml1
159
+ yamlfile = "test.context1.yaml"
160
+ @input = INPUT
161
+ @expected = OUTPUT.gsub(/\(none\)/, 'Hello')
162
+ @options = "-f #{yamlfile}"
163
+ #
164
+ yaml = <<-END
165
+ user: Hello
166
+ password: world
167
+ END
168
+ File.open(yamlfile, 'w') { |f| f.write(yaml) }
169
+ begin
170
+ _test()
171
+ ensure
172
+ File.unlink(yamlfile) if test(?f, yamlfile)
173
+ end
174
+ end
175
+
176
+
177
+ def test_include1
178
+ dir = 'foo'
179
+ lib = 'bar'
180
+ Dir.mkdir dir unless test(?d, dir)
181
+ filename = "#{dir}/#{lib}.rb"
182
+ File.open(filename, 'w') do |f|
183
+ f.write <<-'END'
184
+ def escape(str)
185
+ return "<#{str.upcase}>"
186
+ end
187
+ END
188
+ end
189
+ #
190
+ @input = "<% require '#{lib}' %>\n" + INPUT.gsub(/<%= item %>/, '<%= escape(item) %>')
191
+ @expected = OUTPUT.gsub(/<aaa>/, '<<AAA>>').gsub(/b\&b/, '<B&B>').gsub(/"ccc"/, '<"CCC">')
192
+ @options = "-I #{dir}"
193
+ #
194
+ begin
195
+ _test()
196
+ ensure
197
+ File.unlink filename if test(?f, filename)
198
+ Dir.rmdir dir if test(?d, dir)
199
+ end
200
+ end
201
+
202
+
203
+ def test_require1
204
+ dir = 'foo'
205
+ lib = 'bar'
206
+ Dir.mkdir dir unless test(?d, dir)
207
+ filename = "#{dir}/#{lib}.rb"
208
+ File.open(filename, 'w') do |f|
209
+ f.write <<-'END'
210
+ def escape(str)
211
+ return "<#{str.upcase}>"
212
+ end
213
+ END
214
+ end
215
+ #
216
+ @input = INPUT.gsub(/<%= item %>/, '<%= escape(item) %>')
217
+ @expected = OUTPUT.gsub(/<aaa>/, '<<AAA>>').gsub(/b\&b/, '<B&B>').gsub(/"ccc"/, '<"CCC">')
218
+ @options = "-I #{dir} -r #{lib}"
219
+ #
220
+ begin
221
+ _test()
222
+ ensure
223
+ File.unlink filename if test(?f, filename)
224
+ Dir.rmdir dir if test(?d, dir)
225
+ end
226
+ end
227
+
228
+
229
+ end
@@ -0,0 +1,461 @@
1
+ ##
2
+ ## $Rev: 3 $
3
+ ## $Release: 1.0.0 $
4
+ ## $Date: 2006-01-31 12:54:23 +0900 (Tue, 31 Jan 2006) $
5
+ ##
6
+
7
+ testdir = File.dirname(__FILE__)
8
+ libdir = testdir == '.' ? '../lib' : File.dirname(testdir) + '/lib'
9
+ $: << testdir
10
+ $: << libdir
11
+
12
+ require 'test/unit'
13
+ #require 'test/unit/ui/console/testrunner'
14
+ require 'assert-diff'
15
+ require 'yaml'
16
+ require 'stringio'
17
+
18
+ require 'erubis'
19
+
20
+ class ErubisTest < Test::Unit::TestCase
21
+
22
+ #str = DATA.read()
23
+ str = File.read(__FILE__)
24
+ str.gsub!(/.*^__END__$/m, '')
25
+
26
+ @@ydocs = {}
27
+ YAML.load_documents(str) do |ydoc|
28
+ name = ydoc['name']
29
+ raise "*** test name '#{name}' is duplicated." if @@ydocs[name]
30
+ ydoc.each do |key, val|
31
+ if key[-1] == ?*
32
+ key = key.sub(/\*\z/, '')
33
+ val = val[$target]
34
+ ydoc[key] = val
35
+ end
36
+ end
37
+ @@ydocs[name] = ydoc
38
+ s = <<-END
39
+ def test_#{name}
40
+ @name = #{name.dump}
41
+ _test()
42
+ end
43
+ END
44
+ eval s
45
+ end
46
+
47
+ def _test()
48
+ ydoc = @@ydocs[@name]
49
+ input = ydoc['input']
50
+ src = ydoc['src'].gsub(/@/, ' ')
51
+ output = ydoc['output'].gsub(/@/, ' ')
52
+ klass = ydoc['class'] ? (eval "Erubis::#{ydoc['class']}") : Erubis::Eruby
53
+ options = ydoc['options'] || {}
54
+ testopt = ydoc['testopt']
55
+
56
+ if testopt != 'load_file'
57
+ eruby = klass.new(input, options)
58
+ else
59
+ filename = "tmp.#{name}.eruby"
60
+ begin
61
+ File.open(filename, 'w') { |f| f.write(input) }
62
+ eruby = klass.load_file(filename, options)
63
+ ensure
64
+ File.unlink(filename) if test(?f, filename)
65
+ end
66
+ end
67
+ assert_equal_with_diff(src, eruby.src)
68
+
69
+ return if testopt == 'skip_output'
70
+
71
+ context = {}
72
+ context[:list] = ['<aaa>', 'b&b', '"ccc"']
73
+
74
+ if testopt != 'stdout'
75
+ actual = eruby.evaluate(context)
76
+ assert_equal_with_diff(output, actual)
77
+ else
78
+ begin
79
+ orig = $stdout
80
+ $stdout = stringio = StringIO.new
81
+ actual = eruby.evaluate(context)
82
+ ensure
83
+ $stdout = orig if orig
84
+ end
85
+ assert_nil(actual)
86
+ assert_equal_with_diff(output, stringio.string)
87
+ end
88
+ end
89
+
90
+ end
91
+
92
+ __END__
93
+ ---
94
+ name: basic1
95
+ input: |
96
+ <ul>
97
+ <% for item in list %>
98
+ <li><%= item %></li>
99
+ <% end %>
100
+ </ul>
101
+ src: |
102
+ _out = ''; _out << "<ul>\n"
103
+ for item in list
104
+ _out << " <li>"; _out << ( item ).to_s; _out << "</li>\n"
105
+ end
106
+ _out << "</ul>\n"
107
+ _out
108
+ output: |
109
+ <ul>
110
+ <li><aaa></li>
111
+ <li>b&b</li>
112
+ <li>"ccc"</li>
113
+ </ul>
114
+ ##
115
+ ---
116
+ name: basic2
117
+ input: |
118
+ <ul>
119
+ <% i = 0
120
+ for item in list
121
+ i += 1
122
+ %>
123
+ <li><%= item %></li>
124
+ <% end %>
125
+ </ul>
126
+ src: |
127
+ _out = ''; _out << "<ul>\n"
128
+ i = 0
129
+ for item in list
130
+ i += 1
131
+ @@
132
+ _out << " <li>"; _out << ( item ).to_s; _out << "</li>\n"
133
+ end
134
+ _out << "</ul>\n"
135
+ _out
136
+ output: |
137
+ <ul>
138
+ <li><aaa></li>
139
+ <li>b&b</li>
140
+ <li>"ccc"</li>
141
+ </ul>
142
+ ##
143
+ ---
144
+ name: basic3
145
+ input: |
146
+ <ul><% i = 0
147
+ for item in list
148
+ i += 1 %><li><%= item %></li><% end %>
149
+ </ul>
150
+ src: |
151
+ _out = ''; _out << "<ul>"; i = 0
152
+ for item in list
153
+ i += 1 ; _out << "<li>"; _out << ( item ).to_s; _out << "</li>"; end ; _out << "\n"
154
+ _out << "</ul>\n"
155
+ _out
156
+ output: |
157
+ <ul><li><aaa></li><li>b&b</li><li>"ccc"</li>
158
+ </ul>
159
+ ##
160
+ ---
161
+ name: pattern1
162
+ options:
163
+ :pattern : '\[@ @\]'
164
+ input: |
165
+ <ul>
166
+ [@ for item in list @]
167
+ <li>[@= item @]</li>
168
+ [@ end @]
169
+ </ul>
170
+ src: |
171
+ _out = ''; _out << "<ul>\n"
172
+ for item in list
173
+ _out << " <li>"; _out << ( item ).to_s; _out << "</li>\n"
174
+ end
175
+ _out << "</ul>\n"
176
+ _out
177
+ output: |
178
+ <ul>
179
+ <li><aaa></li>
180
+ <li>b&b</li>
181
+ <li>"ccc"</li>
182
+ </ul>
183
+ ##
184
+ ---
185
+ name: pattern2
186
+ options:
187
+ :pattern : '<(?:!--)?% %(?:--)?>'
188
+ input: |
189
+ <ul>
190
+ <!--% for item in list %-->
191
+ <li><%= item %></li>
192
+ <!--% end %-->
193
+ </ul>
194
+ src: |
195
+ _out = ''; _out << "<ul>\n"
196
+ for item in list
197
+ _out << " <li>"; _out << ( item ).to_s; _out << "</li>\n"
198
+ end
199
+ _out << "</ul>\n"
200
+ _out
201
+ output: |
202
+ <ul>
203
+ <li><aaa></li>
204
+ <li>b&b</li>
205
+ <li>"ccc"</li>
206
+ </ul>
207
+ ##
208
+ ---
209
+ name: trim1
210
+ options:
211
+ :trim : false
212
+ input: |
213
+ <ul>
214
+ <% for item in list %>
215
+ <li><%= item %></li>
216
+ <% end %>
217
+ </ul>
218
+ src: |
219
+ _out = ''; _out << "<ul>\n"
220
+ _out << " "; for item in list ; _out << "\n"
221
+ _out << " <li>"; _out << ( item ).to_s; _out << "</li>\n"
222
+ _out << " "; end ; _out << "\n"
223
+ _out << "</ul>\n"
224
+ _out
225
+ output: |
226
+ <ul>
227
+ @
228
+ <li><aaa></li>
229
+ @
230
+ <li>b&b</li>
231
+ @
232
+ <li>"ccc"</li>
233
+ @
234
+ </ul>
235
+ ##
236
+ ---
237
+ name: xml1
238
+ class: XmlEruby
239
+ input: |
240
+ <pre>
241
+ <% for item in list %>
242
+ <%= item %>
243
+ <%== item %>
244
+ <% end %>
245
+ </pre>
246
+ src: |
247
+ _out = ''; _out << "<pre>\n"
248
+ for item in list
249
+ _out << " "; _out << Erubis::XmlEruby.escape( item ); _out << "\n"
250
+ _out << " "; _out << ( item ).to_s; _out << "\n"
251
+ end
252
+ _out << "</pre>\n"
253
+ _out
254
+ output: |
255
+ <pre>
256
+ &lt;aaa&gt;
257
+ <aaa>
258
+ b&amp;b
259
+ b&b
260
+ &quot;ccc&quot;
261
+ "ccc"
262
+ </pre>
263
+ ##
264
+ ---
265
+ name: xml2
266
+ class: XmlEruby
267
+ testopt: skip_output
268
+ input: |
269
+ <% for item in list %>
270
+ <%= item["var#{n}"] %>
271
+ <%== item["var#{n}"] %>
272
+ <%=== item["var#{n}"] %>
273
+ <%==== item["var#{n}"] %>
274
+ <% end %>
275
+ src: |
276
+ _out = ''; for item in list
277
+ _out << " "; _out << Erubis::XmlEruby.escape( item["var#{n}"] ); _out << "\n"
278
+ _out << " "; _out << ( item["var#{n}"] ).to_s; _out << "\n"
279
+ _out << " "; $stderr.puts("** erubis: item[\"var\#{n}\"] = #{(item["var#{n}"]).inspect}"); _out << "\n"
280
+ _out << " "; _out << "\n"
281
+ end
282
+ _out
283
+ output: |
284
+ ##
285
+ ---
286
+ name: fast1
287
+ class: FastEruby
288
+ input: |
289
+ <table>
290
+ <% for item in list %>
291
+ <tr>
292
+ <td><%= item %></td>
293
+ <td><%== item %></td>
294
+ </tr>
295
+ <% end %>
296
+ </table>
297
+ <ul><% for item in list %><li><%= item %></li><% end %></ul>
298
+ src: |
299
+ _out = ''; _out << "<table>\n"
300
+ for item in list
301
+ _out << " <tr>\n <td>"
302
+ _out << ( item ).to_s; _out << "</td>\n <td>"
303
+ _out << ( item ).to_s; _out << "</td>\n </tr>\n"
304
+
305
+ end
306
+ _out << "</table>\n<ul>"
307
+ for item in list ; _out << "<li>"; _out << ( item ).to_s; _out << "</li>"; end ; _out << "</ul>\n"
308
+ _out
309
+ output: |
310
+ <table>
311
+ <tr>
312
+ <td><aaa></td>
313
+ <td><aaa></td>
314
+ </tr>
315
+ <tr>
316
+ <td>b&b</td>
317
+ <td>b&b</td>
318
+ </tr>
319
+ <tr>
320
+ <td>"ccc"</td>
321
+ <td>"ccc"</td>
322
+ </tr>
323
+ </table>
324
+ <ul><li><aaa></li><li>b&b</li><li>"ccc"</li></ul>
325
+ ##
326
+ ---
327
+ name: fast2
328
+ class: FastXmlEruby
329
+ input: |
330
+ <table>
331
+ <% for item in list %>
332
+ <tr>
333
+ <td><%= item %></td>
334
+ <td><%== item %></td>
335
+ </tr>
336
+ <% end %>
337
+ </table>
338
+ <ul><% for item in list %><li><%= item %></li><% end %></ul>
339
+ src: |
340
+ _out = ''; _out << "<table>\n"
341
+ for item in list
342
+ _out << " <tr>\n <td>"
343
+ _out << Erubis::XmlEruby.escape( item ); _out << "</td>\n <td>"
344
+ _out << ( item ).to_s; _out << "</td>\n </tr>\n"
345
+
346
+ end
347
+ _out << "</table>\n<ul>"
348
+ for item in list ; _out << "<li>"; _out << Erubis::XmlEruby.escape( item ); _out << "</li>"; end ; _out << "</ul>\n"
349
+ _out
350
+ output: |
351
+ <table>
352
+ <tr>
353
+ <td>&lt;aaa&gt;</td>
354
+ <td><aaa></td>
355
+ </tr>
356
+ <tr>
357
+ <td>b&amp;b</td>
358
+ <td>b&b</td>
359
+ </tr>
360
+ <tr>
361
+ <td>&quot;ccc&quot;</td>
362
+ <td>"ccc"</td>
363
+ </tr>
364
+ </table>
365
+ <ul><li>&lt;aaa&gt;</li><li>b&amp;b</li><li>&quot;ccc&quot;</li></ul>
366
+ ##
367
+ ---
368
+ name: fast3
369
+ desc: bug
370
+ class: FastEruby
371
+ input: |
372
+ user = <%= "Foo" %>
373
+ <% for item in list %>
374
+ <%= item %>
375
+ <% end %>
376
+ src: |
377
+ _out = ''; _out << "user = "; _out << ( "Foo" ).to_s; _out << "\n"
378
+ for item in list
379
+ _out << " "; _out << ( item ).to_s; _out << "\n"
380
+ end
381
+ _out
382
+ # _out = ''; _out << "user = "; _out << ( "Foo" ).to_s; _out << "\n"
383
+ # _out << ""; for item in list
384
+ # _out << ""; _out << " "; _out << ( item ).to_s; _out << "\n"
385
+ # _out << ""; end
386
+ # _out << ""; _out
387
+ output: |
388
+ user = Foo
389
+ <aaa>
390
+ b&b
391
+ "ccc"
392
+ ##
393
+ ---
394
+ name: stdout1
395
+ class: StdoutEruby
396
+ testopt: stdout
397
+ input: |
398
+ <ul>
399
+ <% for item in list %>
400
+ <li><%= item %></li>
401
+ <% end %>
402
+ </ul>
403
+ src: |
404
+ _out = $stdout; _out << "<ul>\n"
405
+ for item in list
406
+ _out << " <li>"; _out << ( item ).to_s; _out << "</li>\n"
407
+ end
408
+ _out << "</ul>\n"
409
+ nil
410
+ output: |
411
+ <ul>
412
+ <li><aaa></li>
413
+ <li>b&b</li>
414
+ <li>"ccc"</li>
415
+ </ul>
416
+ ---
417
+ name: loadfile1
418
+ testopt: load_file
419
+ #input: |
420
+ # <ul>
421
+ # <% for item in list %>
422
+ # <li><%= item %></li>
423
+ # <% end %>
424
+ # </ul>
425
+ input:
426
+ "<ul>\r\n <% for item in list %>\r\n <li><%= item %></li>\r\n <% end %>\r\n</ul>\r\n"
427
+ #src: |
428
+ # _out = ''; _out << "<ul>\n"
429
+ # for item in list
430
+ # _out << " <li>"; _out << ( item ).to_s; _out << "</li>\n"
431
+ # end
432
+ # _out << "</ul>\n"
433
+ # _out
434
+ src:
435
+ "_out = ''; _out << \"<ul>\\r\\n\"\n for item in list \r\n_out << \" <li>\"; _out << ( item ).to_s; _out << \"</li>\\r\\n\"\n end \r\n_out << \"</ul>\\r\\n\"\n_out\n"
436
+ #output: |
437
+ # <ul>
438
+ # <li><aaa></li>
439
+ # <li>b&b</li>
440
+ # <li>"ccc"</li>
441
+ # </ul>
442
+ output:
443
+ "<ul>\r\n <li><aaa></li>\r\n <li>b&b</li>\r\n <li>\"ccc\"</li>\r\n</ul>\r\n"
444
+ ##
445
+ ---
446
+ name: nomatch1
447
+ desc: bug
448
+ input: |
449
+ <ul>
450
+ <li>foo</li>
451
+ </ul>
452
+ src: |
453
+ _out = ''; _out << "<ul>\n"
454
+ _out << " <li>foo</li>\n"
455
+ _out << "</ul>\n"
456
+ _out
457
+ output: |
458
+ <ul>
459
+ <li>foo</li>
460
+ </ul>
461
+ ##