ruport 0.8.14 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. data/README +42 -107
  2. data/Rakefile +29 -32
  3. data/examples/centered_pdf_text_box.rb +13 -19
  4. data/examples/example.csv +3 -0
  5. data/examples/line_plotter.rb +15 -15
  6. data/examples/pdf_complex_report.rb +10 -23
  7. data/examples/pdf_table_with_title.rb +12 -12
  8. data/examples/rope_examples/itunes/Rakefile +22 -1
  9. data/examples/rope_examples/itunes/config/environment.rb +4 -0
  10. data/examples/rope_examples/itunes/lib/init.rb +32 -2
  11. data/examples/rope_examples/itunes/util/build +50 -16
  12. data/examples/rope_examples/sales_report/README +1 -1
  13. data/examples/rope_examples/sales_report/Rakefile +22 -1
  14. data/examples/rope_examples/sales_report/config/environment.rb +4 -0
  15. data/examples/rope_examples/sales_report/lib/init.rb +32 -2
  16. data/examples/rope_examples/sales_report/lib/reports/sales.rb +10 -16
  17. data/examples/rope_examples/sales_report/util/build +50 -16
  18. data/examples/row_renderer.rb +39 -0
  19. data/examples/ruport_list/png_embed.rb +61 -0
  20. data/examples/ruport_list/roadmap.png +0 -0
  21. data/examples/sample.rb +16 -0
  22. data/examples/simple_pdf_lines.rb +24 -0
  23. data/lib/ruport.rb +143 -57
  24. data/lib/ruport/acts_as_reportable.rb +246 -0
  25. data/lib/ruport/data.rb +1 -2
  26. data/lib/ruport/data/grouping.rb +311 -0
  27. data/lib/ruport/data/record.rb +113 -84
  28. data/lib/ruport/data/table.rb +275 -174
  29. data/lib/ruport/formatter.rb +149 -0
  30. data/lib/ruport/formatter/csv.rb +87 -0
  31. data/lib/ruport/formatter/html.rb +89 -0
  32. data/lib/ruport/formatter/pdf.rb +357 -0
  33. data/lib/ruport/formatter/text.rb +151 -0
  34. data/lib/ruport/generator.rb +127 -30
  35. data/lib/ruport/query.rb +46 -99
  36. data/lib/ruport/renderer.rb +238 -194
  37. data/lib/ruport/renderer/grouping.rb +67 -0
  38. data/lib/ruport/renderer/table.rb +25 -98
  39. data/lib/ruport/report.rb +45 -96
  40. data/test/acts_as_reportable_test.rb +229 -0
  41. data/test/csv_formatter_test.rb +97 -0
  42. data/test/{_test_database.rb → database_test_.rb} +0 -0
  43. data/test/grouping_test.rb +305 -0
  44. data/test/html_formatter_test.rb +104 -0
  45. data/test/pdf_formatter_test.rb +25 -0
  46. data/test/{test_query.rb → query_test.rb} +32 -121
  47. data/test/{test_record.rb → record_test.rb} +40 -23
  48. data/test/renderer_test.rb +344 -0
  49. data/test/{test_report.rb → report_test.rb} +74 -44
  50. data/test/samples/ticket_count.csv +124 -0
  51. data/test/{test_sql_split.rb → sql_split_test.rb} +0 -0
  52. data/test/{test_table.rb → table_test.rb} +255 -44
  53. data/test/text_formatter_test.rb +144 -0
  54. data/util/bench/data/record/bench_as_vs_to.rb +17 -0
  55. data/util/bench/data/record/bench_constructor.rb +46 -0
  56. data/util/bench/data/record/bench_indexing.rb +65 -0
  57. data/util/bench/data/record/bench_reorder.rb +35 -0
  58. data/util/bench/data/record/bench_to_a.rb +19 -0
  59. data/util/bench/data/table/bench_column_manip.rb +103 -0
  60. data/util/bench/data/table/bench_dup.rb +24 -0
  61. data/util/bench/data/table/bench_init.rb +67 -0
  62. data/util/bench/data/table/bench_manip.rb +125 -0
  63. data/util/bench/formatter/bench_csv.rb +14 -0
  64. data/util/bench/formatter/bench_html.rb +14 -0
  65. data/util/bench/formatter/bench_pdf.rb +14 -0
  66. data/util/bench/formatter/bench_text.rb +14 -0
  67. data/util/bench/samples/tattle.csv +1237 -0
  68. metadata +121 -143
  69. data/TODO +0 -21
  70. data/examples/invoice.rb +0 -142
  71. data/examples/invoice_report.rb +0 -29
  72. data/examples/line_graph.rb +0 -38
  73. data/examples/rope_examples/itunes/config/ruport_config.rb +0 -8
  74. data/examples/rope_examples/sales_report/config/ruport_config.rb +0 -8
  75. data/lib/ruport/attempt.rb +0 -63
  76. data/lib/ruport/config.rb +0 -204
  77. data/lib/ruport/data/groupable.rb +0 -93
  78. data/lib/ruport/data/taggable.rb +0 -80
  79. data/lib/ruport/format.rb +0 -1
  80. data/lib/ruport/format/csv.rb +0 -29
  81. data/lib/ruport/format/html.rb +0 -42
  82. data/lib/ruport/format/latex.rb +0 -47
  83. data/lib/ruport/format/pdf.rb +0 -233
  84. data/lib/ruport/format/plugin.rb +0 -31
  85. data/lib/ruport/format/svg.rb +0 -60
  86. data/lib/ruport/format/text.rb +0 -103
  87. data/lib/ruport/format/xml.rb +0 -32
  88. data/lib/ruport/layout.rb +0 -1
  89. data/lib/ruport/layout/component.rb +0 -7
  90. data/lib/ruport/mailer.rb +0 -99
  91. data/lib/ruport/renderer/graph.rb +0 -46
  92. data/lib/ruport/report/graph.rb +0 -14
  93. data/lib/ruport/system_extensions.rb +0 -71
  94. data/test/test_config.rb +0 -88
  95. data/test/test_format_text.rb +0 -63
  96. data/test/test_graph_renderer.rb +0 -97
  97. data/test/test_groupable.rb +0 -56
  98. data/test/test_mailer.rb +0 -170
  99. data/test/test_renderer.rb +0 -151
  100. data/test/test_ruport.rb +0 -58
  101. data/test/test_table_renderer.rb +0 -141
  102. data/test/test_taggable.rb +0 -52
@@ -0,0 +1,25 @@
1
+ require "test/unit"
2
+ require "ruport"
3
+
4
+ begin
5
+ require "rubygems"
6
+ rescue LoadError
7
+ nil
8
+ end
9
+
10
+ class TestFormatPDF < Test::Unit::TestCase
11
+
12
+ def test_render_pdf_basic
13
+ begin
14
+ quiet { require "pdf/writer" }
15
+ rescue LoadError
16
+ warn "skipping pdf test"; return
17
+ end
18
+ data = [[1,2],[3,4]].to_table
19
+ assert_raise(RuntimeError) { data.to_pdf }
20
+
21
+ data.column_names = %w[a b]
22
+ assert_nothing_raised { data.to_pdf }
23
+ end
24
+
25
+ end
@@ -22,8 +22,8 @@
22
22
  :alternative => {
23
23
  :dsn => "ruport:test2", :user => "sandal", :password => "harmonix" },
24
24
  }
25
- Ruport::Config.source :default, @sources[:default]
26
- Ruport::Config.source :alternative, @sources[:alternative]
25
+ Ruport::Query.add_source :default, @sources[:default]
26
+ Ruport::Query.add_source :alternative, @sources[:alternative]
27
27
 
28
28
  @columns = %w(a b c)
29
29
  @data = [ [[1,2,3],[4,5,6],[7,8,9]],
@@ -38,22 +38,17 @@
38
38
  :plain => Ruport::Query.new(@sql[0]),
39
39
  :sourced => Ruport::Query.new(@sql[0], :source => :alternative),
40
40
  :paramed => Ruport::Query.new(@sql[0], :params => [ 42 ]),
41
- :cached => Ruport::Query.new(@sql[0], :cache_enabled => true),
42
- :uncached => Ruport::Query.new(@sql[0], :cache_enabled => false),
43
- :precached => Ruport::Query.new(@sql[0], :cache_enabled => true),
44
- :raw => Ruport::Query.new(@sql[0], :raw_data => true),
45
- :unraw => Ruport::Query.new(@sql[0], :raw_data => false),
41
+ :raw => Ruport::Query.new(@sql[0], :row_type => :raw),
46
42
  :resultless => Ruport::Query.new(@sql[1]),
47
43
  :multi => Ruport::Query.new(@sql[2]),
48
44
  :mixed => Ruport::Query.new(@sql[3]),
49
45
  }
50
- @query[:precached].cached_data = @data[0]
51
46
  end
52
47
 
53
48
  if Object.const_defined? :Mocha and Object.const_defined? :DBI
54
49
 
55
50
  def test_execute
56
- query = @query[:uncached]
51
+ query = @query[:plain]
57
52
  setup_mock_dbi(1)
58
53
 
59
54
  assert_equal nil, query.execute
@@ -74,26 +69,6 @@
74
69
  assert_equal nil, query.execute
75
70
  end
76
71
 
77
- def test_result_cache_disabled
78
- query = @query[:uncached]
79
- setup_mock_dbi(3)
80
-
81
- assert_nothing_raised { query.result }
82
- assert_equal @data[1], get_raw(query.result)
83
- assert_equal @data[2], get_raw(query.result)
84
-
85
- end
86
-
87
- def test_result_cache_enabled
88
- query = @query[:cached]
89
-
90
- setup_mock_dbi(1)
91
-
92
- assert_nothing_raised { query.result }
93
- assert_equal @data[0], get_raw(query.result)
94
- assert_equal @data[0], get_raw(query.result)
95
- end
96
-
97
72
  def test_result_resultless
98
73
  query = @query[:resultless]
99
74
  setup_mock_dbi(1, :resultless => true, :sql => @sql[1])
@@ -108,13 +83,6 @@
108
83
  assert_equal @data[1], get_raw(query.result)
109
84
  end
110
85
 
111
- def test_result_raw_disabled
112
- query = @query[:unraw]
113
- setup_mock_dbi(1)
114
-
115
- assert_equal @data[0].to_table(@columns), query.result
116
- end
117
-
118
86
  def test_result_raw_enabled
119
87
  query = @query[:raw]
120
88
  setup_mock_dbi(1)
@@ -122,49 +90,6 @@
122
90
  assert_equal @data[0], query.result
123
91
  end
124
92
 
125
- def test_update_cache
126
- query = @query[:cached]
127
- setup_mock_dbi(2)
128
-
129
- assert_equal @data[0], get_raw(query.result)
130
- query.update_cache
131
- assert_equal @data[1], get_raw(query.cached_data)
132
- assert_equal @data[1], get_raw(query.result)
133
- end
134
-
135
- def test_clear_cache
136
- query = @query[:cached]
137
- setup_mock_dbi(2)
138
-
139
- assert_equal @data[0], get_raw(query.result)
140
-
141
- query.clear_cache
142
- assert_equal nil, query.cached_data
143
- assert_equal @data[1], get_raw(query.result)
144
- end
145
-
146
- def test_disable_caching
147
- query = @query[:cached]
148
- setup_mock_dbi(3)
149
-
150
- assert_equal @data[0], get_raw(query.result)
151
- assert_equal @data[0], get_raw(query.result)
152
- query.disable_caching
153
- assert_equal @data[1], get_raw(query.result)
154
- assert_equal @data[2], get_raw(query.result)
155
- end
156
-
157
- def test_enable_caching
158
- query = @query[:uncached]
159
- setup_mock_dbi(3)
160
-
161
- assert_equal @data[0], get_raw(query.result)
162
- assert_equal @data[1], get_raw(query.result)
163
- query.enable_caching
164
- assert_equal @data[2], get_raw(query.result)
165
- assert_equal @data[2], get_raw(query.result)
166
- end
167
-
168
93
  def test_load_file
169
94
  File.expects(:read).
170
95
  with("query_test.sql").
@@ -174,32 +99,18 @@
174
99
  assert_equal "select * from foo", query.sql
175
100
  end
176
101
 
177
- def test_load_file_erb
178
- @table = 'bar'
179
- File.expects(:read).
180
- with("query_test.sql").
181
- returns("select * from <%= @table %>\n")
182
-
183
- query = Ruport::Query.new "query_test.sql", :binding => binding
184
- assert_equal "select * from bar", query.sql
185
- end
186
-
187
102
  def test_load_file_not_found
188
103
  File.expects(:read).
189
104
  with("query_test.sql").
190
105
  raises(Errno::ENOENT)
191
- Ruport.expects(:log).
192
- with("Could not open query_test.sql",
193
- :status => :fatal, :exception => LoadError).
194
- raises(LoadError)
195
106
 
196
107
  assert_raises LoadError do
197
108
  query = Ruport::Query.new "query_test.sql"
198
109
  end
199
110
  end
200
111
 
201
- def test_each_cache_disabled
202
- query = @query[:uncached]
112
+ def test_each
113
+ query = @query[:plain]
203
114
  setup_mock_dbi(2)
204
115
 
205
116
  result = []; query.each { |r| result << r.to_a }
@@ -208,18 +119,7 @@
208
119
  result = []; query.each { |r| result << r.to_a }
209
120
  assert_equal @data[1], result
210
121
  end
211
-
212
- def test_each_cache_enabled
213
- query = @query[:cached]
214
- setup_mock_dbi(1)
215
-
216
- result = []; query.each { |r| result << r.to_a }
217
- assert_equal @data[0], result
218
-
219
- result = []; query.each { |r| result << r.to_a }
220
- assert_equal @data[0], result
221
- end
222
-
122
+
223
123
  def test_each_multi
224
124
  query = @query[:multi]
225
125
  setup_mock_dbi(2)
@@ -231,13 +131,11 @@
231
131
  end
232
132
 
233
133
  def test_each_without_block
234
- assert_raise (LocalJumpError) { @query[:precached].each }
134
+ assert_raise (LocalJumpError) { @query[:plain].each }
235
135
  end
236
136
 
237
137
  def test_select_source
238
- query = @query[:precached]
239
- assert_equal @sources[:default], get_query_source(query)
240
-
138
+ query = @query[:plain]
241
139
  query.select_source :alternative
242
140
  assert_equal @sources[:alternative], get_query_source(query)
243
141
 
@@ -258,15 +156,6 @@
258
156
  assert_equal @sources[:alternative], get_query_source(query2)
259
157
  end
260
158
 
261
- def test_generator
262
- query = @query[:precached]
263
- gen = query.generator
264
- assert_equal @data[0][0], gen.next
265
- assert_equal @data[0][1], gen.next
266
- assert_equal @data[0][2], gen.next
267
- assert_raise(EOFError) { gen.next }
268
- end
269
-
270
159
  if Object.const_defined? :Mocha and Object.const_defined? :DBI
271
160
 
272
161
  def test_to_table
@@ -285,6 +174,29 @@
285
174
  csv = @data[0].to_table(@columns).as(:csv)
286
175
  assert_equal csv, query.to_csv
287
176
  end
177
+
178
+ def test_missing_dsn
179
+ assert_raise(ArgumentError) {
180
+ Ruport::Query.add_source :foo, :user => "root", :password => "fff"
181
+ }
182
+ assert_nothing_raised { Ruport::Query.add_source :bar, :dsn => "..." }
183
+ end
184
+
185
+ def test_new_defaults
186
+ Ruport::Query.add_source :default, :dsn => "dbi:mysql:test",
187
+ :user => "root",
188
+ :password => ""
189
+ assert_equal("dbi:mysql:test", Ruport::Query.default_source.dsn)
190
+ assert_equal("root", Ruport::Query.default_source.user)
191
+ assert_equal("", Ruport::Query.default_source.password)
192
+ end
193
+
194
+ def test_multiple_sources
195
+ Ruport::Query.add_source :foo, :dsn => "dbi:mysql:test"
196
+ Ruport::Query.add_source :bar, :dsn => "dbi:mysql:test2"
197
+ assert_equal("dbi:mysql:test", Ruport::Query.sources[:foo].dsn)
198
+ assert_equal("dbi:mysql:test2", Ruport::Query.sources[:bar].dsn)
199
+ end
288
200
 
289
201
  end
290
202
 
@@ -330,5 +242,4 @@
330
242
  def get_raw(table)
331
243
  table.map { |row| row.to_a }
332
244
  end
333
-
334
245
  end
@@ -94,9 +94,9 @@ class TestRecord < Test::Unit::TestCase
94
94
  assert_equal [1,2,3,4], @record.to_a
95
95
  end
96
96
 
97
- def test_to_h
98
- assert_nothing_raised { @record.to_h }
99
- assert_equal({ "a" => 1, "b" => 2, "c" => 3, "d" => 4 }, @record.to_h)
97
+ def test_to_hash
98
+ assert_nothing_raised { @record.to_hash }
99
+ assert_equal({ "a" => 1, "b" => 2, "c" => 3, "d" => 4 }, @record.to_hash)
100
100
  end
101
101
 
102
102
  def test_rename_attribute
@@ -172,13 +172,9 @@ class TestRecord < Test::Unit::TestCase
172
172
  rec2["b"] = 7
173
173
  rec2[2] = 9
174
174
 
175
- rec2.tag(:apple)
176
175
 
177
176
  assert_equal [1,2,3,4], rec1.to_a
178
177
  assert_equal [5,7,9,4], rec2.to_a
179
-
180
- assert_equal Set.new([]), rec1.tags
181
- assert_equal Set.new([:apple]), rec2.tags
182
178
  end
183
179
 
184
180
  def test_records_with_same_attrs_and_data_hash_the_same
@@ -201,7 +197,7 @@ class TestRecord < Test::Unit::TestCase
201
197
  assert_equal 3,r.length
202
198
  assert_equal 3,r.size
203
199
  end
204
-
200
+
205
201
  def test_reindex
206
202
  assert_equal %w[a b c d], @record.attributes
207
203
  #old_object_id = @record.instance_variable_get(:@attributes).object_id
@@ -211,7 +207,28 @@ class TestRecord < Test::Unit::TestCase
211
207
 
212
208
  new_object_id = @record.instance_variable_get(:@attributes).object_id
213
209
  assert_equal a.object_id, new_object_id
214
- end
210
+ end
211
+
212
+ def test_record_as
213
+ rendered_row = @record.as(:text)
214
+ assert_equal("| 1 | 2 | 3 | 4 |\n", rendered_row)
215
+ end
216
+
217
+ def test_to_hack
218
+ rendered_row = @record.to_text
219
+ assert_equal("| 1 | 2 | 3 | 4 |\n", rendered_row)
220
+
221
+ rendered_row = @record.to_csv(:format_options => { :col_sep => "\t"})
222
+ assert_equal("1\t2\t3\t4\n",rendered_row)
223
+ end
224
+
225
+ def test_as_throws_proper_errors
226
+ a = Record.new({ "a" => 1, "b" => 2 })
227
+ assert_nothing_raised { a.as(:csv) }
228
+ assert_nothing_raised { a.to_csv }
229
+ assert_raises(Ruport::Renderer::UnknownFormatError) { a.as(:nothing) }
230
+ assert_raises(Ruport::Renderer::UnknownFormatError) { a.to_nothing }
231
+ end
215
232
 
216
233
  #----------------------------------------------------------------------
217
234
  # BUG Traps
@@ -231,15 +248,6 @@ class TestRecord < Test::Unit::TestCase
231
248
  assert_equal 1, a["a"]
232
249
  end
233
250
 
234
- def test_ensure_tags_get_duped
235
- a = Record.new([1,2,3])
236
- a.tag :foo
237
- assert a.tags.include?(:foo)
238
- b = a.dup
239
- assert b.tags.include?(:foo)
240
- assert_not_same a.tags, b.tags
241
- end
242
-
243
251
  # Ticket #172
244
252
  def test_ensure_get_really_indifferent
245
253
  a = Record.new({"a" => 1, "b" => 2})
@@ -250,12 +258,14 @@ class TestRecord < Test::Unit::TestCase
250
258
  assert_equal(2,a.get(:b))
251
259
  end
252
260
 
253
- def test_ensure_get_works_ordinally
261
+ def test_ensure_attributes_not_broken_by_to_hack
262
+ record = Ruport::Data::Record.new [1,2], :attributes => %w[a to_something]
263
+ assert_equal 2, record.to_something
264
+ end
265
+
266
+ def test_ensure_get_throws_argument_error
254
267
  a = Record.new({"a" => 1, "b" => 2})
255
- assert_nothing_raised { a.get(0) }
256
- b = Record.new({"a" => 1, "b" => 2},:attributes => %w[a b])
257
- assert_equal 2, a.get(1)
258
- assert_equal 1, a.get(0)
268
+ assert_raises(ArgumentError) { a.get([]) }
259
269
  end
260
270
 
261
271
  def test_ensure_delete_removes_attribute
@@ -282,4 +292,11 @@ class TestRecord < Test::Unit::TestCase
282
292
  assert_equal(["a","b","c"], a.attributes)
283
293
  end
284
294
 
295
+ class MyRecordSub < Ruport::Data::Record; end
296
+
297
+ def test_ensure_record_subclasses_render_properly
298
+ a = MyRecordSub.new [1,2,3]
299
+ assert_equal "1,2,3\n", a.to_csv
300
+ end
301
+
285
302
  end
@@ -0,0 +1,344 @@
1
+ require 'test/unit'
2
+ require 'ruport'
3
+
4
+
5
+ class TrivialRenderer < Ruport::Renderer
6
+
7
+ def run
8
+ formatter do
9
+ build_header
10
+ build_body
11
+ build_footer
12
+ end
13
+ end
14
+
15
+ end
16
+
17
+ class YetAnotherRenderer < Ruport::Renderer
18
+ stage :header,:body,:footer
19
+ end
20
+
21
+ class DummyText < Ruport::Formatter
22
+
23
+ renders :text, :for => TrivialRenderer
24
+
25
+ def prepare_document
26
+ output << "p"
27
+ end
28
+
29
+ def build_header
30
+ output << "header\n"
31
+ end
32
+
33
+ def build_body
34
+ output << "body\n"
35
+ end
36
+
37
+ def build_footer
38
+ output << "footer\n"
39
+ end
40
+
41
+ def finalize_document
42
+ output << "f"
43
+ end
44
+ end
45
+
46
+ class WithLayout < DummyText
47
+ renders :text_with_layout, :for => YetAnotherRenderer
48
+
49
+ def layout
50
+ output << "---\n"
51
+ yield
52
+ output << "---\n"
53
+ end
54
+
55
+ end
56
+
57
+ class TrivialRenderer2 < TrivialRenderer; end
58
+
59
+ class MultiPurposeFormatter < Ruport::Formatter
60
+
61
+ renders [:html,:text], :for => TrivialRenderer2
62
+
63
+ def build_header
64
+ a = 10
65
+
66
+ text { output << "Foo: #{a}\n" }
67
+ html { output << "<b>Foo: #{a}</b>\n" }
68
+ end
69
+
70
+ def build_body
71
+ html { output << "<pre>\n" }
72
+ output << options.body_text
73
+ html { output << "\n</pre>\n" }
74
+ end
75
+
76
+ def build_footer; end
77
+ end
78
+
79
+
80
+ # FIXME: come up with a better name
81
+ class RendererWithHelpers < Ruport::Renderer
82
+
83
+ add_format DummyText, :text
84
+
85
+ prepare :document
86
+
87
+ option :subtitle, :subsubtitle
88
+
89
+ stage :header
90
+ stage :body
91
+ stage :footer
92
+
93
+ finalize :document
94
+
95
+ def setup
96
+ options.apple = true
97
+ end
98
+
99
+ end
100
+
101
+ class RendererWithRunHook < Ruport::Renderer
102
+
103
+ include AutoRunner
104
+
105
+ add_format DummyText, :text
106
+
107
+ required_option :foo,:bar
108
+ stage :header
109
+ stage :body
110
+ stage :footer
111
+
112
+ def run
113
+ formatter.output << "|"
114
+ end
115
+
116
+ end
117
+
118
+ class RendererWithHelperModule < TrivialRenderer2
119
+
120
+ add_format DummyText, :stub
121
+
122
+ module Helpers
123
+ def say_hello
124
+ "Hello Dolly"
125
+ end
126
+ end
127
+ end
128
+
129
+ class TestRenderer < Test::Unit::TestCase
130
+
131
+ def test_multi_purpose
132
+ text = TrivialRenderer2.render_text(:body_text => "foo")
133
+ assert_equal "Foo: 10\nfoo", text
134
+ html = TrivialRenderer2.render_html(:body_text => "bar")
135
+ assert_equal "<b>Foo: 10</b>\n<pre>\nbar\n</pre>\n",html
136
+ end
137
+
138
+
139
+ def test_renderer_with_run_hooks
140
+ assert_equal "|header\nbody\nfooter\n",
141
+ RendererWithRunHook.render_text(:foo => "bar",:bar => "baz")
142
+ end
143
+
144
+ def test_method_missing_hack_formatter
145
+ assert_equal [:html,:text], MultiPurposeFormatter.formats
146
+
147
+ a = MultiPurposeFormatter.new
148
+ a.format = :html
149
+
150
+ visited = false
151
+ a.html { visited = true }
152
+
153
+ assert visited
154
+
155
+ visited = false
156
+ a.text { visited = true }
157
+ assert !visited
158
+
159
+ assert_raises(NoMethodError) do
160
+ a.pdf { 'do nothing' }
161
+ end
162
+ end
163
+
164
+ def test_hash_options_setters
165
+ a = RendererWithHelpers.render(:text, :subtitle => "foo",
166
+ :subsubtitle => "bar") { |r|
167
+ assert_equal "foo", r.options.subtitle
168
+ assert_equal "bar", r.options.subsubtitle
169
+ }
170
+ end
171
+
172
+ def test_data_accessors
173
+ a = RendererWithHelpers.render(:text, :data => [1,2,4]) { |r|
174
+ assert_equal [1,2,4], r.data
175
+ }
176
+
177
+ b = RendererWithHelpers.render_text(%w[a b c]) { |r|
178
+ assert_equal %w[a b c], r.data
179
+ }
180
+
181
+ c = RendererWithHelpers.render_text(%w[a b f],:snapper => :red) { |r|
182
+ assert_equal %w[a b f], r.data
183
+ assert_equal :red, r.options.snapper
184
+ }
185
+ end
186
+
187
+ def test_using_io
188
+ require "stringio"
189
+ out = StringIO.new
190
+ a = TrivialRenderer.render(:text) { |r| r.io = out }
191
+ out.rewind
192
+ assert_equal "header\nbody\nfooter\n", out.read
193
+ assert_equal "", out.read
194
+ end
195
+
196
+ def test_trivial
197
+ actual = TrivialRenderer.render(:text)
198
+ assert_equal "header\nbody\nfooter\n", actual
199
+ end
200
+
201
+ def test_formats
202
+ assert_equal( {}, Ruport::Renderer.formats )
203
+ assert_equal( { :text => DummyText },TrivialRenderer.formats )
204
+ end
205
+
206
+ def test_stage_helper
207
+ assert RendererWithHelpers.stages.include?('body')
208
+ end
209
+
210
+ def test_finalize_helper
211
+ assert_equal :document, RendererWithHelpers.final_stage
212
+ end
213
+
214
+ def test_prepare_helper
215
+ assert_equal :document, RendererWithHelpers.first_stage
216
+ end
217
+
218
+ def test_finalize_again
219
+ assert_raise(Ruport::Renderer::StageAlreadyDefinedError) {
220
+ RendererWithHelpers.finalize :report
221
+ }
222
+ end
223
+
224
+ def test_prepare_again
225
+ assert_raise(Ruport::Renderer::StageAlreadyDefinedError) {
226
+ RendererWithHelpers.prepare :foo
227
+ }
228
+ end
229
+
230
+ def test_renderer_using_helpers
231
+ actual = RendererWithHelpers.render(:text)
232
+ assert_equal "pheader\nbody\nfooter\nf", actual
233
+
234
+ actual = RendererWithHelpers.render_text
235
+ assert_equal "pheader\nbody\nfooter\nf", actual
236
+ end
237
+
238
+ def test_setup
239
+ actual = false
240
+ RendererWithHelpers.render_text { |r|
241
+ actual = r.options.apple
242
+ }
243
+ assert actual
244
+ end
245
+
246
+ def test_option_helper
247
+ RendererWithHelpers.render_text do |r|
248
+ r.subtitle = "Test Report"
249
+ assert_equal "Test Report", r.options.subtitle
250
+ end
251
+ end
252
+
253
+ def test_required_option_helper
254
+ a = RendererWithHelpers.dup
255
+ a.required_option :title
256
+
257
+ a.render_text do |r|
258
+ r.title = "Test Report"
259
+ assert_equal "Test Report", r.options.title
260
+ end
261
+
262
+ end
263
+
264
+ def test_without_required_option
265
+
266
+ a = RendererWithHelpers.dup
267
+ a.required_option :title
268
+
269
+ assert_raise(Ruport::Renderer::RequiredOptionNotSet) { a.render(:text) }
270
+ end
271
+
272
+ def test_method_missing
273
+ actual = TrivialRenderer.render_text
274
+ assert_equal "header\nbody\nfooter\n", actual
275
+ end
276
+
277
+ def test_formatter
278
+ #RendererWithHelpers.required_option :title
279
+
280
+ assert_raise(RuntimeError) { RendererWithHelpers.render(:text) }
281
+ end
282
+
283
+
284
+ def test_method_missing
285
+ actual = TrivialRenderer.render_text
286
+ assert_equal "header\nbody\nfooter\n", actual
287
+ end
288
+
289
+ def test_formatter
290
+ # normal instance mode
291
+
292
+ rend = TrivialRenderer.new
293
+ rend.send(:use_formatter,:text)
294
+
295
+ assert_kind_of Ruport::Formatter, rend.formatter
296
+ assert_kind_of DummyText, rend.formatter
297
+
298
+ # render mode
299
+ TrivialRenderer.render_text do |r|
300
+ assert_kind_of Ruport::Formatter, r.formatter
301
+ assert_kind_of DummyText, r.formatter
302
+ end
303
+
304
+ assert_equal "body\n", rend.formatter { build_body }.output
305
+
306
+ rend.formatter.clear_output
307
+ assert_equal "", rend.formatter.output
308
+ end
309
+
310
+ def test_options_act_like_indifferent_hash
311
+ opts = Ruport::Renderer::Options.new
312
+ opts.foo = "bar"
313
+ assert_equal "bar", opts[:foo]
314
+ assert_equal "bar", opts["foo"]
315
+
316
+ opts["f"] = "bar"
317
+ assert_equal "bar", opts[:f]
318
+ assert_equal "bar", opts.f
319
+ assert_equal "bar", opts["f"]
320
+
321
+ opts[:apple] = "banana"
322
+ assert_equal "banana", opts.apple
323
+ assert_equal "banana", opts["apple"]
324
+ assert_equal "banana", opts[:apple]
325
+ end
326
+
327
+ def test_add_format_private
328
+ assert_raise(NoMethodError) { Ruport::Renderer.add_format }
329
+ end
330
+
331
+ def test_layout
332
+ assert_equal "---\nheader\nbody\nfooter\n---\n",
333
+ YetAnotherRenderer.render_text_with_layout
334
+ end
335
+
336
+ def test_renderer_helper_module
337
+ RendererWithHelperModule.render_stub do |r|
338
+ assert_equal "Hello Dolly", r.formatter.say_hello
339
+ end
340
+ end
341
+
342
+
343
+
344
+ end