tenjin 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (170) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.txt +54 -0
  3. data/benchmark/bench.rb +502 -0
  4. data/benchmark/bench_context.rb +17 -0
  5. data/benchmark/bench_context.yaml +141 -0
  6. data/benchmark/templates/_footer.html +4 -0
  7. data/benchmark/templates/_header.html +52 -0
  8. data/benchmark/templates/bench_eruby.rhtml +29 -0
  9. data/benchmark/templates/bench_tenjin.rbhtml +29 -0
  10. data/bin/rbtenjin +449 -0
  11. data/doc-api/classes/Tenjin.html +141 -0
  12. data/doc-api/classes/Tenjin/ArrayBufferTemplate.html +270 -0
  13. data/doc-api/classes/Tenjin/BaseContext.html +312 -0
  14. data/doc-api/classes/Tenjin/Context.html +126 -0
  15. data/doc-api/classes/Tenjin/ContextHelper.html +433 -0
  16. data/doc-api/classes/Tenjin/Engine.html +616 -0
  17. data/doc-api/classes/Tenjin/ErubisTemplate.html +166 -0
  18. data/doc-api/classes/Tenjin/HtmlHelper.html +359 -0
  19. data/doc-api/classes/Tenjin/Preprocessor.html +242 -0
  20. data/doc-api/classes/Tenjin/Template.html +916 -0
  21. data/doc-api/created.rid +1 -0
  22. data/doc-api/files/README_txt.html +185 -0
  23. data/doc-api/files/lib/tenjin_rb.html +136 -0
  24. data/doc-api/fr_class_index.html +36 -0
  25. data/doc-api/fr_file_index.html +28 -0
  26. data/doc-api/fr_method_index.html +89 -0
  27. data/doc-api/index.html +24 -0
  28. data/doc-api/rdoc-style.css +208 -0
  29. data/doc/docstyle.css +188 -0
  30. data/doc/examples.html +312 -0
  31. data/doc/faq.html +909 -0
  32. data/doc/users-guide.html +1691 -0
  33. data/lib/tenjin.rb +959 -0
  34. data/setup.rb +1331 -0
  35. data/tenjin.gemspec +58 -0
  36. data/test/assert-text-equal.rb +45 -0
  37. data/test/data/examples/form/create.rbhtml +4 -0
  38. data/test/data/examples/form/form.rbhtml +14 -0
  39. data/test/data/examples/form/layout.rbhtml +8 -0
  40. data/test/data/examples/form/main.rb +9 -0
  41. data/test/data/examples/form/main.result +21 -0
  42. data/test/data/examples/form/update.rbhtml +4 -0
  43. data/test/data/examples/preprocessing/helper.rb +16 -0
  44. data/test/data/examples/preprocessing/main.rb +11 -0
  45. data/test/data/examples/preprocessing/main.result +17 -0
  46. data/test/data/examples/preprocessing/select.rbhtml +15 -0
  47. data/test/data/examples/preprocessing/select_P.result +18 -0
  48. data/test/data/examples/table/table.rb +9 -0
  49. data/test/data/examples/table/table.rbhtml +16 -0
  50. data/test/data/examples/table/table.result +20 -0
  51. data/test/data/examples/table/table_s.result +18 -0
  52. data/test/data/faq/ex1.rbhtml +5 -0
  53. data/test/data/faq/ex10-baselayout.rbhtml +27 -0
  54. data/test/data/faq/ex10-content.rbhtml +12 -0
  55. data/test/data/faq/ex10-customlayout.rbhtml +11 -0
  56. data/test/data/faq/ex10_inherit.result +25 -0
  57. data/test/data/faq/ex11-bench.rb +28 -0
  58. data/test/data/faq/ex11-content.rbhtml +9 -0
  59. data/test/data/faq/ex11-layout1.rbhtml +5 -0
  60. data/test/data/faq/ex11-layout2.rbhtml +6 -0
  61. data/test/data/faq/ex11.rb +5 -0
  62. data/test/data/faq/ex11.rbhtml +8 -0
  63. data/test/data/faq/ex11.source +11 -0
  64. data/test/data/faq/ex11_arraybuffer.result +15 -0
  65. data/test/data/faq/ex1_chksyntax.result +3 -0
  66. data/test/data/faq/ex2-content.rbhtml +3 -0
  67. data/test/data/faq/ex2-layout.rbhtml +11 -0
  68. data/test/data/faq/ex2_removenl.result +19 -0
  69. data/test/data/faq/ex3.rb +4 -0
  70. data/test/data/faq/ex3.rbhtml +1 -0
  71. data/test/data/faq/ex3_escapefunc1.result +2 -0
  72. data/test/data/faq/ex3_escapefunc2.result +2 -0
  73. data/test/data/faq/ex5.rbhtml +7 -0
  74. data/test/data/faq/ex5_template_args.source +9 -0
  75. data/test/data/faq/ex6-content.rhtml +6 -0
  76. data/test/data/faq/ex6-layout.rhtml +6 -0
  77. data/test/data/faq/ex6.rb +10 -0
  78. data/test/data/faq/ex6_eruby.result +12 -0
  79. data/test/data/faq/ex7-expr-pattern.rb +34 -0
  80. data/test/data/faq/ex7-expr-pattern.rbhtml +3 -0
  81. data/test/data/faq/ex7_expr_pattern.result +4 -0
  82. data/test/data/faq/ex8-m18n.rb +77 -0
  83. data/test/data/faq/ex8-m18n.rbhtml +4 -0
  84. data/test/data/faq/ex8_m18n.result +10 -0
  85. data/test/data/faq/ex9-baselayout.rbhtml +8 -0
  86. data/test/data/faq/ex9-content.rbhtml +6 -0
  87. data/test/data/faq/ex9-mylayout.rbhtml +5 -0
  88. data/test/data/faq/ex9_changelayout.result +11 -0
  89. data/test/data/users_guide/content6.rbhtml +3 -0
  90. data/test/data/users_guide/content7.rbhtml +5 -0
  91. data/test/data/users_guide/content8.rbhtml +2 -0
  92. data/test/data/users_guide/contextdata.rb +7 -0
  93. data/test/data/users_guide/datafile.rb +5 -0
  94. data/test/data/users_guide/datafile.yaml +10 -0
  95. data/test/data/users_guide/ex.rbhtml +6 -0
  96. data/test/data/users_guide/ex.result +7 -0
  97. data/test/data/users_guide/ex.script +5 -0
  98. data/test/data/users_guide/ex_script.result +7 -0
  99. data/test/data/users_guide/ex_source.result +8 -0
  100. data/test/data/users_guide/example1.rbhtml +12 -0
  101. data/test/data/users_guide/example1.result +17 -0
  102. data/test/data/users_guide/example10.rbhtml +4 -0
  103. data/test/data/users_guide/example10_template_args.result +6 -0
  104. data/test/data/users_guide/example11.rbhtml +5 -0
  105. data/test/data/users_guide/example11_template_args_result +2 -0
  106. data/test/data/users_guide/example12.rbhtml +12 -0
  107. data/test/data/users_guide/example12_preprocessed.result +10 -0
  108. data/test/data/users_guide/example12_preprocessed_source.result +10 -0
  109. data/test/data/users_guide/example13.rbhtml +6 -0
  110. data/test/data/users_guide/example13_preprocessed.result +2 -0
  111. data/test/data/users_guide/example13_preprocessed_source.result +2 -0
  112. data/test/data/users_guide/example14.rb +32 -0
  113. data/test/data/users_guide/example14.rbhtml +6 -0
  114. data/test/data/users_guide/example14_tmplclass.result +15 -0
  115. data/test/data/users_guide/example15.rb +10 -0
  116. data/test/data/users_guide/example15_escapefunc.result +14 -0
  117. data/test/data/users_guide/example16.rbhtml +4 -0
  118. data/test/data/users_guide/example16a.rb +10 -0
  119. data/test/data/users_guide/example16a.result +4 -0
  120. data/test/data/users_guide/example16b.rb +13 -0
  121. data/test/data/users_guide/example16b.result +4 -0
  122. data/test/data/users_guide/example16c.rb +12 -0
  123. data/test/data/users_guide/example16c.result +4 -0
  124. data/test/data/users_guide/example1_S.result +14 -0
  125. data/test/data/users_guide/example1_SXNC.result +10 -0
  126. data/test/data/users_guide/example1_source.result +14 -0
  127. data/test/data/users_guide/example2.rbhtml +3 -0
  128. data/test/data/users_guide/example2_sb.result2 +9 -0
  129. data/test/data/users_guide/example3.rbhtml +5 -0
  130. data/test/data/users_guide/example3_syntaxcheck.result +2 -0
  131. data/test/data/users_guide/example4.rbhtml +13 -0
  132. data/test/data/users_guide/example4_datafile_rb.result +13 -0
  133. data/test/data/users_guide/example4_yaml.result +13 -0
  134. data/test/data/users_guide/example5.rbhtml +9 -0
  135. data/test/data/users_guide/example5_datastr_rb.result +9 -0
  136. data/test/data/users_guide/example5_datastr_yaml.result +9 -0
  137. data/test/data/users_guide/example6.rbhtml +19 -0
  138. data/test/data/users_guide/example6_layout.result +29 -0
  139. data/test/data/users_guide/example6_nested.result +28 -0
  140. data/test/data/users_guide/example7_layout2.result +13 -0
  141. data/test/data/users_guide/example8_layout3.result +8 -0
  142. data/test/data/users_guide/example9.rbhtml +18 -0
  143. data/test/data/users_guide/example9_capture.result +26 -0
  144. data/test/data/users_guide/footer.html +5 -0
  145. data/test/data/users_guide/footer.rbhtml +4 -0
  146. data/test/data/users_guide/layout6.rbhtml +17 -0
  147. data/test/data/users_guide/layout7.rbhtml +9 -0
  148. data/test/data/users_guide/layout8_html.rbhtml +5 -0
  149. data/test/data/users_guide/layout8_xhtml.rbhtml +6 -0
  150. data/test/data/users_guide/layout9.rbhtml +25 -0
  151. data/test/data/users_guide/sidemenu.rbhtml +5 -0
  152. data/test/data/users_guide/user_app.cgi +39 -0
  153. data/test/data/users_guide/user_app.result +30 -0
  154. data/test/data/users_guide/user_create.rbhtml +6 -0
  155. data/test/data/users_guide/user_edit.rbhtml +7 -0
  156. data/test/data/users_guide/user_form.rbhtml +10 -0
  157. data/test/data/users_guide/user_layout.rbhtml +16 -0
  158. data/test/test_all.rb +23 -0
  159. data/test/test_engine.rb +526 -0
  160. data/test/test_engine.yaml +2039 -0
  161. data/test/test_examples.rb +81 -0
  162. data/test/test_faq.rb +60 -0
  163. data/test/test_htmlhelper.rb +78 -0
  164. data/test/test_main.rb +564 -0
  165. data/test/test_main.yaml +174 -0
  166. data/test/test_template.rb +113 -0
  167. data/test/test_template.yaml +1244 -0
  168. data/test/test_users_guide.rb +75 -0
  169. data/test/testcase-helper.rb +166 -0
  170. metadata +226 -0
@@ -0,0 +1,81 @@
1
+ ###
2
+ ### $Rev: 54 $
3
+ ### $Release: 0.6.0 $
4
+ ### copyright(c) 2007 kuwata-lab all rights reserved.
5
+ ###
6
+
7
+ require 'test/unit'
8
+ #require 'testutil'
9
+ #require 'testcase-helper'
10
+ require 'assert-text-equal'
11
+
12
+ #class Symbol
13
+ # def <=>(other)
14
+ # return self.to_s <=> other.to_s
15
+ # end
16
+ #end
17
+ #
18
+ #class Hash
19
+ # def each
20
+ # self.keys.sort.each do |key|
21
+ # val = self[key]
22
+ # yield key, val
23
+ # end
24
+ # end
25
+ #end
26
+
27
+ require 'tenjin'
28
+
29
+ class TenjinExamplesTest < Test::Unit::TestCase
30
+
31
+ DIR = File.expand_path(File.dirname(__FILE__) + '/data/examples')
32
+ CWD = Dir.pwd()
33
+
34
+
35
+ def setup
36
+ Dir.chdir DIR
37
+ end
38
+
39
+
40
+ def teardown
41
+ Dir.chdir CWD
42
+ end
43
+
44
+
45
+ def _test
46
+ dirname = File.dirname(@filename)
47
+ if dirname == '.'
48
+ filename = @filename
49
+ else
50
+ filename = File.basename(@filename)
51
+ Dir.chdir(dirname)
52
+ end
53
+ s = File.read(filename)
54
+ s =~ /\A\$ (.*?)\n/
55
+ command = $1
56
+ expected = $'
57
+ result = `#{command}`
58
+ assert_text_equal(expected, result)
59
+ end
60
+
61
+
62
+ Dir.chdir DIR do
63
+ filenames = []
64
+ filenames += Dir.glob('**/*.result')
65
+ filenames += Dir.glob('**/*.source')
66
+ filenames.each do |filename|
67
+ name = filename.gsub(/[^\w]/, '_')
68
+ s = <<-END
69
+ def test_#{name}
70
+ # $stderr.puts "*** debug: test_#{name}"
71
+ @name = '#{name}'
72
+ @filename = '#{filename}'
73
+ _test()
74
+ end
75
+ END
76
+ eval s
77
+ end
78
+ end
79
+
80
+
81
+ end
data/test/test_faq.rb ADDED
@@ -0,0 +1,60 @@
1
+ ###
2
+ ### $Rev: 45 $
3
+ ### $Release: 0.6.0 $
4
+ ### copyright(c) 2007 kuwata-lab all rights reserved.
5
+ ###
6
+
7
+ require 'test/unit'
8
+ #require 'testutil'
9
+ #require 'testcase-helper'
10
+ require 'assert-text-equal'
11
+
12
+ require 'tenjin'
13
+
14
+ class TenjinFaqTest < Test::Unit::TestCase
15
+
16
+ DIR = File.expand_path(File.dirname(__FILE__) + '/data/faq')
17
+ CWD = Dir.pwd()
18
+
19
+
20
+ def setup
21
+ Dir.chdir DIR
22
+ end
23
+
24
+
25
+ def teardown
26
+ Dir.chdir CWD
27
+ end
28
+
29
+
30
+ def _test
31
+ @name = (caller()[0] =~ /`(.*?)'/) && $1
32
+ s = File.read(@filename)
33
+ s =~ /\A\$ (.*?)\n/
34
+ command = $1
35
+ expected = $'
36
+ result = `#{command}`
37
+ assert_text_equal(expected, result)
38
+ end
39
+
40
+
41
+ Dir.chdir DIR do
42
+ filenames = []
43
+ filenames += Dir.glob('*.result')
44
+ filenames += Dir.glob('*.source')
45
+ filenames.each do |filename|
46
+ name = filename.gsub(/[^\w]/, '_')
47
+ s = <<-END
48
+ def test_#{name}
49
+ # $stderr.puts "*** debug: test_#{name}"
50
+ @name = '#{name}'
51
+ @filename = '#{filename}'
52
+ _test()
53
+ end
54
+ END
55
+ eval s
56
+ end
57
+ end
58
+
59
+
60
+ end
@@ -0,0 +1,78 @@
1
+ ###
2
+ ### $Rev: 52 $
3
+ ### $Release: 0.6.0 $
4
+ ### copyright(c) 2007 kuwata-lab all rights reserved.
5
+ ###
6
+
7
+ require 'test/unit'
8
+ #require 'testutil'
9
+ require 'testcase-helper'
10
+ require 'assert-text-equal'
11
+ require 'tenjin'
12
+
13
+
14
+ class TenjinHtmlHelperTest < Test::Unit::TestCase
15
+
16
+ def test_tagattr
17
+ actual = Tenjin::HtmlHelper.tagattr('size', 20)
18
+ expected = ' size="20"'
19
+ assert_equal(expected, actual)
20
+ #
21
+ actual = Tenjin::HtmlHelper.tagattr('size', nil)
22
+ expected = ''
23
+ assert_equal(expected, actual)
24
+ #
25
+ actual = Tenjin::HtmlHelper.tagattr('checked', true, 'checked')
26
+ expected = ' checked="checked"'
27
+ assert_equal(expected, actual)
28
+ #
29
+ actual = Tenjin::HtmlHelper.tagattr('checked', false, 'checked')
30
+ expected = ''
31
+ assert_equal(expected, actual)
32
+ end
33
+
34
+ def test_checked
35
+ actual = Tenjin::HtmlHelper.checked(1==1)
36
+ expected = ' checked="checked"'
37
+ assert_equal(expected, actual)
38
+ #
39
+ actual = Tenjin::HtmlHelper.checked(1==0)
40
+ expected = ''
41
+ assert_equal(expected, actual)
42
+ end
43
+
44
+ def test_selected
45
+ actual = Tenjin::HtmlHelper.selected(1==1)
46
+ expected = ' selected="selected"'
47
+ assert_equal(expected, actual)
48
+ #
49
+ actual = Tenjin::HtmlHelper.selected(1==0)
50
+ expected = ''
51
+ assert_equal(expected, actual)
52
+ end
53
+
54
+ def test_disabled
55
+ actual = Tenjin::HtmlHelper.disabled(1==1)
56
+ expected = ' disabled="disabled"'
57
+ assert_equal(expected, actual)
58
+ #
59
+ actual = Tenjin::HtmlHelper.disabled(1==0)
60
+ expected = ''
61
+ assert_equal(expected, actual)
62
+ end
63
+
64
+ def test_nl2br
65
+ s = """foo\nbar\nbaz\n"""
66
+ actual = Tenjin::HtmlHelper.nl2br(s)
67
+ expected = "foo<br />\nbar<br />\nbaz<br />\n"
68
+ assert_equal(expected, actual)
69
+ end
70
+
71
+ def test_text2html
72
+ s = """foo\n bar\nba z\n"""
73
+ actual = Tenjin::HtmlHelper.text2html(s)
74
+ expected = "foo<br />\n &nbsp; &nbsp;bar<br />\nba &nbsp; &nbsp; z<br />\n"
75
+ assert_equal(expected, actual)
76
+ end
77
+
78
+ end
data/test/test_main.rb ADDED
@@ -0,0 +1,564 @@
1
+ ###
2
+ ### $Rev: 59 $
3
+ ### $Release: 0.6.0 $
4
+ ### copyright(c) 2007 kuwata-lab all rights reserved.
5
+ ###
6
+
7
+ require 'test/unit'
8
+ #require 'testutil'
9
+ require 'testcase-helper'
10
+ require 'assert-text-equal'
11
+
12
+ require 'tenjin'
13
+ DONT_INVOKE = true
14
+ load File.dirname(File.dirname(File.expand_path(__FILE__))) + '/bin/rbtenjin'
15
+
16
+
17
+ def to_list(value)
18
+ return value.is_a?(Array) ? value : [value]
19
+ end
20
+
21
+
22
+ INPUT = <<'END'
23
+ <ul>
24
+ <?rb for item in ['<a&b>', '["c",'+"'d']"] ?>
25
+ <li>#{item}
26
+ ${item}</li>
27
+ <?rb end ?>
28
+ </ul>
29
+ END
30
+
31
+ INPUT2 = <<'END'
32
+ <ul>
33
+ <?rb for item in ['<a&b>', '["c",'+"'d']"] ?>
34
+ <li>#{item}
35
+ ${item}</li>
36
+ <?rb end ?>
37
+ </ul>
38
+ END
39
+ INPUT2.gsub!(/\n/, "\r\n")
40
+
41
+ INPUT3 = <<'END'
42
+ <?rb
43
+ #title = _context['title']
44
+ #items = _context.items
45
+ ?>
46
+ <h1>#{@title}</h1>
47
+ <ul>
48
+ <?rb for item in @items ?>
49
+ <li>#{item}</li>
50
+ <?rb end ?>
51
+ </ul>
52
+ END
53
+
54
+ SOURCE = <<'END'
55
+ _buf = ''; _buf << %Q`<ul>\n`
56
+ for item in ['<a&b>', '["c",'+"'d']"]
57
+ _buf << %Q` <li>#{item}
58
+ #{escape((item).to_s)}</li>\n`
59
+ end
60
+ _buf << %Q`</ul>\n`
61
+ _buf.to_s
62
+ END
63
+
64
+ SOURCE2 = <<'END'
65
+ _buf = ''; _buf << %Q`<ul>\r\n`
66
+ for item in ['<a&b>', '["c",'+"'d']"]
67
+ _buf << %Q` <li>#{item}\r
68
+ #{escape((item).to_s)}</li>\r\n`
69
+ end
70
+ _buf << %Q`</ul>\r\n`
71
+ _buf.to_s
72
+ END
73
+ SOURCE2.gsub!(/\n/, "\r\n")
74
+
75
+ SOURCE4 = <<'END'
76
+ _buf = []; _buf.push('<ul>
77
+ '); for item in ['<a&b>', '["c",'+"'d']"]
78
+ _buf.push(' <li>', (item).to_s, '
79
+ ', escape((item).to_s), '</li>
80
+ '); end
81
+ _buf.push('</ul>
82
+ ');
83
+ _buf.to_s
84
+ END
85
+
86
+ OUTPUT = <<'END'
87
+ <ul>
88
+ <li><a&b>
89
+ &lt;a&amp;b&gt;</li>
90
+ <li>["c",'d']
91
+ [&quot;c&quot;,'d']</li>
92
+ </ul>
93
+ END
94
+
95
+ OUTPUT2 = <<'END'
96
+ <ul>
97
+ <li><a&b>
98
+ &lt;a&amp;b&gt;</li>
99
+ <li>["c",'d']
100
+ [&quot;c&quot;,'d']</li>
101
+ </ul>
102
+ END
103
+ OUTPUT2.gsub!(/\n/, "\r\n")
104
+
105
+ OUTPUT3 = <<'END'
106
+ <h1>rbtenjin example</h1>
107
+ <ul>
108
+ <li>aaa</li>
109
+ <li>bbb</li>
110
+ <li>ccc</li>
111
+ </ul>
112
+ END
113
+
114
+ CONTEXT1 = <<'END'
115
+ title: rbtenjin example
116
+ items:
117
+ - aaa
118
+ - bbb
119
+ - ccc
120
+ END
121
+
122
+ CONTEXT2 = <<'END'
123
+ @title = 'rbtenjin example'
124
+ @items = ['aaa', 'bbb', 'ccc']
125
+ END
126
+
127
+
128
+ class TenjinMainTest < Test::Unit::TestCase
129
+
130
+ filename = __FILE__.sub(/\.\w+$/, '.yaml')
131
+ #load_yaml_testdata(filename)
132
+ eval load_yaml_testdata(filename)
133
+
134
+ def initialize(*args)
135
+ super
136
+ @name = @input = @options = @filename = @context_file = @exception = @errormsg = @expected = nil
137
+ end
138
+
139
+ def _test
140
+ @name = (caller[0] =~ /`(.*?)'/) && $&
141
+ return if ENV['TEST'] && ENV['TEST'] != @name
142
+ #
143
+ @input ||= ''
144
+ @options ||= ''
145
+ #
146
+ if @filename != false
147
+ @filename ||= '.test.rbhtml'
148
+ for fname, s in to_list(@filename).zip(to_list(@input))
149
+ File.open(fname, 'w') { |f| f.write(s) }
150
+ end
151
+ end
152
+ #
153
+ if @options.is_a?(Array)
154
+ argv = @options.dup
155
+ elsif @options.is_a?(String)
156
+ argv = @options.split()
157
+ end
158
+ #argv.insert(0, 'rbtenjin')
159
+ argv.concat(to_list(@filename)) if @filename
160
+ if @context_file
161
+ File.open(@context_file, 'w') { |f| f.write(@context_data) }
162
+ end
163
+ main = Tenjin::Main.new(argv)
164
+ if @exception
165
+ if @exception.is_a?(@exception)
166
+ @exception = Kernel.const_get(@exception)
167
+ end
168
+ ex = assert_raise(@exception) do
169
+ output = main.execute()
170
+ end
171
+ if @errormsg
172
+ assert_text_equal(@errormsg, ex.to_s)
173
+ end
174
+ else
175
+ output = main.execute()
176
+ assert_text_equal(@expected, output)
177
+ end
178
+ ensure
179
+ to_list(@filename).each { |fname| File.unlink(fname) } if @filename
180
+ File.unlink(@context_file) if @context_file
181
+ end
182
+
183
+
184
+ def test_help() # -h
185
+ @options = "-h"
186
+ @input = ""
187
+ @expected = Tenjin::Main.new(['rbtenjin']).usage()
188
+ _test()
189
+ #
190
+ @options = "--help"
191
+ _test()
192
+ end
193
+
194
+
195
+ def test_version() # -v, --version
196
+ @options = "-v"
197
+ @input = ""
198
+ @expected = Tenjin::Main.new(['rbtenjin']).version() + "\n"
199
+ _test()
200
+ @options = "--version"
201
+ _test()
202
+ end
203
+
204
+
205
+ # def test_help_and_version() # -hVc
206
+ # @options = "-hVc"
207
+ # @input = "<?rb foo() ?>"
208
+ # app = Tenjin::Main.new(['rbtenjin'])
209
+ # @expected = app.version() + "\n" + app.usage('rbtenjin')
210
+ # _test()
211
+ # end
212
+
213
+
214
+ def test_execute() # ''
215
+ @options = ""
216
+ @input = INPUT
217
+ @expected = OUTPUT
218
+ _test()
219
+ end
220
+
221
+
222
+ def test_source() # -s, -a convert
223
+ @options = "-s"
224
+ @input = INPUT
225
+ @expected = SOURCE
226
+ _test()
227
+ @options = "-a convert"
228
+ _test()
229
+ end
230
+
231
+
232
+ def test_source2() # -s
233
+ @options = "-s"
234
+ n1 = "<ul>\n".length
235
+ n2 = "</ul>\n".length
236
+ @input = INPUT[n1...-n2]
237
+ #buf = SOURCE.to_a()[1...-2]
238
+ buf = SOURCE.split(/\n/).collect{|l| l+"\n"}[1..-3]
239
+ buf[0,0] = "_buf = ''; "
240
+ buf << "_buf.to_s\n"
241
+ @expected = buf.join
242
+ #$stderr.puts "*** debug: @input=#{@input}"
243
+ #$stderr.puts "*** debug: @expected=#{@expected}"
244
+ _test()
245
+ @options = "-a convert"
246
+ _test()
247
+ end
248
+
249
+
250
+ def test_source3() # -sb, -baconvert
251
+ @options = "-sb"
252
+ @input = INPUT
253
+ n1 = "_buf = ''; ".length
254
+ n2 = "_buf.to_s\n".length
255
+ @expected = SOURCE[n1...-n2]
256
+ _test()
257
+ @options = "-baconvert"
258
+ _test()
259
+ end
260
+
261
+
262
+ # def test_indent() # -si2
263
+ # @options = "-si2"
264
+ # @input = INPUT
265
+ # @expected = SOURCE.replace(' _buf', ' _buf')
266
+ # _test()
267
+ # end
268
+
269
+
270
+ def test_quiet() # -q
271
+ @options = "-z"
272
+ input = INPUT
273
+ @input = [input, input, input]
274
+ basename = ".test_quiet%d.rbhtml"
275
+ @filename = (0..3).collect { |i| basename % i }
276
+ @expected = (0..3).collect { |i| "#{basename % i}: Syntax OK\n" }.join
277
+ _test()
278
+ #
279
+ @options = "-zq"
280
+ @expected = ""
281
+ _test()
282
+ @options = "-qasyntax"
283
+ _test()
284
+ end
285
+
286
+
287
+ def test_invalid_options() # -Y, -i, -f, -c, -i foo
288
+ @input = INPUT
289
+ @expected = ""
290
+ @exception = Tenjin::CommandOptionError
291
+ #
292
+ @options = "-hY"
293
+ @errormsg = "-Y: unknown option."
294
+ _test()
295
+ #
296
+ # @options = "-i"
297
+ # @filename = false
298
+ # @errormsg = "-i: indent width required."
299
+ # _test()
300
+ #
301
+ @options = "-f"
302
+ @filename = false
303
+ #@errormsg = "-f: context data filename required."
304
+ @errormsg = "-f: argument required."
305
+ _test()
306
+ #
307
+ @options = "-c"
308
+ @filename = false
309
+ #@errormsg = "-c: context data string required."
310
+ @errormsg = "-c: argument required."
311
+ _test()
312
+ #
313
+ # @options = "-i foo"
314
+ # @errormsg = "-i: integer value required."
315
+ # _test()
316
+ end #
317
+
318
+
319
+ def test_newline()
320
+ @input = INPUT2
321
+ @expected = SOURCE2
322
+ @options = "-s"
323
+ _test()
324
+ @options = ""
325
+ @expected = OUTPUT2
326
+ _test()
327
+ end
328
+
329
+
330
+ def test_datafile_yaml() # -f datafile.yaml
331
+ context_filename = 'test.datafile.yaml'
332
+ @options = "-f " + context_filename
333
+ @input = INPUT3
334
+ @expected = OUTPUT3
335
+ @context_file = context_filename
336
+ @context_data = CONTEXT1
337
+ _test()
338
+ end
339
+
340
+
341
+ def test_datafile_rb() # -f datafile.rb
342
+ context_filename = 'test.datafile.rb'
343
+ @options = "-f " + context_filename
344
+ @input = INPUT3
345
+ @expected = OUTPUT3
346
+ @context_file = context_filename
347
+ @context_data = CONTEXT2
348
+ _test()
349
+ end
350
+
351
+
352
+ def test_datafile_error() # -f file.txt, not-a-mapping context data
353
+ context_filename = 'test.datafile.txt'
354
+ @options = "-f " + context_filename
355
+ @exception = Tenjin::CommandOptionError
356
+ @errormsg = "-f %s: file not found." % context_filename
357
+ _test()
358
+ #
359
+ @context_file = context_filename
360
+ @context_data = "- foo\n- bar\n -baz"
361
+ @errormsg = "-f %s: unknown file type ('*.yaml' or '*.rb' expected)." % context_filename
362
+ _test()
363
+ #
364
+ context_filename = 'test.datafile.yaml'
365
+ @options = "-f " + context_filename
366
+ @errormsg = "%s: not a mapping (hash)." % context_filename
367
+ @context_file = context_filename
368
+ _test()
369
+ end
370
+
371
+
372
+ def test_context_yaml() # -c yamlstr
373
+ @options = ['-c', '{title: rbtenjin example, items: [aaa, bbb, ccc]}']
374
+ @input = INPUT3
375
+ @expected = OUTPUT3
376
+ _test()
377
+ end
378
+
379
+
380
+ def test_context_rb() # -c python-code
381
+ @options = ['-c', '@title="rbtenjin example"; @items=["aaa", "bbb", "ccc"]']
382
+ @input = INPUT3
383
+ @expected = OUTPUT3
384
+ _test()
385
+ end
386
+
387
+
388
+ def test_untabify() # -T
389
+ context_filename = 'test.datafile.yaml'
390
+ @options = "-Tf " + context_filename
391
+ @input = INPUT3
392
+ @expected = OUTPUT3
393
+ @context_file = context_filename
394
+ @context_data = CONTEXT1
395
+ #@exception = yaml.parser.ScannerError
396
+ @exception = ArgumentError
397
+ _test()
398
+ end
399
+
400
+
401
+ def test_modules() # -r libraries
402
+ #@options = "--escapefunc=CGI.escapeHTML"
403
+ @options = "--escapefunc=ERB::Util.html_escape"
404
+ @input = INPUT
405
+ @expected = OUTPUT
406
+ @exception = NameError
407
+ if defined?(YARVCore)
408
+ #@errormsg = "uninitialized constant Tenjin::Context::CGI"
409
+ @errormsg = "uninitialized constant Tenjin::Context::ERB"
410
+ else
411
+ #@errormsg = "uninitialized constant Tenjin::Template::CGI"
412
+ @errormsg = "uninitialized constant Tenjin::Template::ERB"
413
+ end
414
+ _test()
415
+ #
416
+ #@options = "-r cgi --escapefunc=CGI.escapeHTML"
417
+ @options = "-r erb --escapefunc=ERB::Util.html_escape"
418
+ @input = INPUT
419
+ @expected = OUTPUT
420
+ @exception = nil
421
+ @errormsg = nil
422
+ _test()
423
+ end
424
+
425
+
426
+ def test_modules_err() # -r hogeratta
427
+ @options = '-r hogeratta'
428
+ @exception = Tenjin::CommandOptionError
429
+ @errormsg = '-r hogeratta: library not found.'
430
+ _test()
431
+ end
432
+
433
+
434
+ def test_escapefunc() # --escapefunc=cgi.escape
435
+ @options = "--escapefunc=CGI.escapeHTML -s"
436
+ @input = INPUT
437
+ @expected = SOURCE.gsub('escape', 'CGI.escapeHTML')
438
+ _test()
439
+ end
440
+
441
+
442
+ # def test_tostrfunc() # --tostrfunc=str
443
+ # @options = "--tostrfunc=str"
444
+ # @input = INPUT
445
+ # @expected = SOURCE.replace('to_str', 'str')
446
+ # _test()
447
+ # end
448
+
449
+
450
+ def test_preamble() # --preamble --postamble
451
+ @options = ["--preamble=_buf=[];", "--postamble=_buf.join", "-s"]
452
+ @input = INPUT
453
+ @expected = SOURCE.sub(/^_buf = ''; /, '_buf=[];').sub(/_buf.to_s/, '_buf.join')
454
+ _test()
455
+ end
456
+
457
+
458
+ def test_templateclass() # --templateclass
459
+ @options = "--templateclass=Tenjin::ArrayBufferTemplate -s"
460
+ @input = INPUT
461
+ @expected = SOURCE4
462
+ _test()
463
+ @options = "--templateclass=Tenjin::ArrayBufferTemplate"
464
+ @expected = OUTPUT
465
+ _test()
466
+ end
467
+
468
+
469
+ def test_template_path() # --path
470
+ layout = <<'END'
471
+ <html>
472
+ <body>
473
+ #{@_content}
474
+ <?rb import(:footer) ?>
475
+ </body>
476
+ </html>
477
+ END
478
+ body = <<'END'
479
+ <ul>
480
+ <?rb for item in %w[A B C] ?>
481
+ <li>${item}</li>
482
+ <?rb end ?>
483
+ </ul>
484
+ END
485
+ footer = <<'END'
486
+ <hr />
487
+ <a href="mailto:webmaster@localhost">webmaser</a>
488
+ END
489
+ expected = <<'END'
490
+ <html>
491
+ <body>
492
+ <ul>
493
+ <li>A</li>
494
+ <li>B</li>
495
+ <li>C</li>
496
+ </ul>
497
+
498
+ <hr />
499
+ <a href="mailto:webmaster@localhost">webmaser</a>
500
+ </body>
501
+ </html>
502
+ END
503
+ # setup
504
+ begin
505
+ Dir.mkdir("tmpl9") unless test(?d, "tmpl9")
506
+ Dir.mkdir("tmpl9/user") unless test(?d, "tmpl9/user")
507
+ File.write("tmpl9/layout.rbhtml", layout)
508
+ File.write("tmpl9/body.rbhtml", '')
509
+ File.write("tmpl9/footer.rbhtml", '')
510
+ File.write("tmpl9/user/body.rbhtml", body)
511
+ File.write("tmpl9/user/footer.rbhtml", footer)
512
+ # body
513
+ @options = "--path=.,tmpl9/user,tmpl9 --postfix=.rbhtml --layout=:layout"
514
+ @input = "<?rb import(:body) ?>"
515
+ @expected = expected
516
+ _test()
517
+ # footer
518
+ ensure
519
+ require 'fileutils'
520
+ FileUtils.rm_rf('tmpl9')
521
+ end
522
+ end
523
+
524
+
525
+ def test_preprocessor # -P --preprocess
526
+ @options = "-P"
527
+ @input = <<'END'
528
+ <?RB states = { "CA"=>"California", ?>
529
+ <?RB "NY"=>"New York", ?>
530
+ <?RB "FL"=>"Florida", } ?>
531
+ <?rb chk = { @user['state'] => ' checked="checked"' } ?>
532
+ <select name="state">
533
+ <?RB for code in states.keys.sort ?>
534
+ <option value="#{{code}}"#{chk[#{{code.inspect}}]}>${{states[code]}}</option>
535
+ <?RB end ?>
536
+ </select>
537
+ END
538
+ script = <<'END'
539
+ <?rb chk = { @user['state'] => ' checked="checked"' } ?>
540
+ <select name="state">
541
+ <option value="CA"#{chk["CA"]}>California</option>
542
+ <option value="FL"#{chk["FL"]}>Florida</option>
543
+ <option value="NY"#{chk["NY"]}>New York</option>
544
+ </select>
545
+ END
546
+ @expected = script
547
+ _test()
548
+ @options = "-apreprocess"
549
+ _test()
550
+ #
551
+ expected = <<'END'
552
+ <select name="state">
553
+ <option value="CA">California</option>
554
+ <option value="FL" checked="checked">Florida</option>
555
+ <option value="NY">New York</option>
556
+ </select>
557
+ END
558
+ @options = ["-c", "{user: {state: FL}}", "--preprocess"]
559
+ @expected = expected
560
+ _test()
561
+ end
562
+
563
+
564
+ end