ruport 1.6.3 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/AUTHORS +11 -0
  3. data/CHANGELOG.md +38 -0
  4. data/HACKING +1 -17
  5. data/README.md +97 -0
  6. data/Rakefile +9 -50
  7. data/examples/add_row_table.rb +46 -0
  8. data/examples/data/wine.csv +255 -0
  9. data/examples/pdf_grouping.rb +39 -0
  10. data/examples/pdf_table.rb +28 -0
  11. data/examples/pdf_table_from_csv.rb +26 -0
  12. data/examples/pdf_table_prawn.rb +30 -0
  13. data/examples/pdf_table_simple.rb +13 -0
  14. data/examples/row_renderer.rb +1 -1
  15. data/examples/simple_pdf_lines.rb +1 -1
  16. data/examples/trac_ticket_status.rb +1 -1
  17. data/lib/ruport/controller.rb +17 -21
  18. data/lib/ruport/data/feeder.rb +2 -2
  19. data/lib/ruport/data/grouping.rb +8 -8
  20. data/lib/ruport/data/record.rb +4 -4
  21. data/lib/ruport/data/table.rb +318 -206
  22. data/lib/ruport/formatter/csv.rb +6 -7
  23. data/lib/ruport/formatter/html.rb +13 -11
  24. data/lib/ruport/formatter/markdown.rb +105 -0
  25. data/lib/ruport/formatter/prawn_pdf.rb +159 -0
  26. data/lib/ruport/formatter/template.rb +1 -1
  27. data/lib/ruport/formatter/text.rb +1 -1
  28. data/lib/ruport/formatter.rb +54 -54
  29. data/lib/ruport/version.rb +1 -1
  30. data/lib/ruport.rb +7 -23
  31. data/test/controller_test.rb +201 -225
  32. data/test/csv_formatter_test.rb +36 -36
  33. data/test/data_feeder_test.rb +64 -64
  34. data/test/expected_outputs/prawn_pdf_formatter/pdf_basic.pdf.test +265 -0
  35. data/test/grouping_test.rb +103 -102
  36. data/test/helpers.rb +29 -10
  37. data/test/html_formatter_test.rb +46 -46
  38. data/test/markdown_formatter_test.rb +142 -0
  39. data/test/prawn_pdf_formatter_test.rb +108 -0
  40. data/test/record_test.rb +91 -91
  41. data/test/samples/sales.csv +21 -0
  42. data/test/table_pivot_test.rb +77 -26
  43. data/test/table_test.rb +376 -354
  44. data/test/template_test.rb +13 -13
  45. data/test/text_formatter_test.rb +52 -52
  46. data/util/bench/data/table/bench_column_manip.rb +0 -1
  47. data/util/bench/data/table/bench_dup.rb +0 -1
  48. data/util/bench/data/table/bench_init.rb +1 -2
  49. data/util/bench/data/table/bench_manip.rb +0 -1
  50. data/util/bench/formatter/bench_csv.rb +0 -1
  51. data/util/bench/formatter/bench_html.rb +0 -1
  52. data/util/bench/formatter/bench_pdf.rb +0 -1
  53. data/util/bench/formatter/bench_text.rb +0 -1
  54. metadata +131 -82
  55. data/README +0 -114
  56. data/lib/ruport/formatter/pdf.rb +0 -591
  57. data/test/pdf_formatter_test.rb +0 -354
@@ -1,8 +1,8 @@
1
- #!/usr/bin/env ruby -w
1
+ #!/usr/bin/env ruby -w
2
2
  require File.join(File.expand_path(File.dirname(__FILE__)), "helpers")
3
3
 
4
- class TestRenderHTMLTable < Test::Unit::TestCase
5
-
4
+ class TestRenderHTMLTable < Minitest::Test
5
+
6
6
  def setup
7
7
  Ruport::Formatter::Template.create(:simple) do |format|
8
8
  format.table = {
@@ -14,7 +14,7 @@ class TestRenderHTMLTable < Test::Unit::TestCase
14
14
  }
15
15
  end
16
16
  end
17
-
17
+
18
18
  def test_html_table
19
19
  a = Ruport::Formatter::HTML.new
20
20
 
@@ -23,34 +23,34 @@ class TestRenderHTMLTable < Test::Unit::TestCase
23
23
  end
24
24
 
25
25
  def test_render_html_basic
26
-
26
+
27
27
  actual = Ruport::Controller::Table.render_html { |r|
28
- r.data = Table([], :data => [[1,2,3],[4,5,6]])
29
- }
30
-
28
+ r.data = Ruport.Table([], :data => [[1,2,3],[4,5,6]])
29
+ }
30
+
31
31
  assert_equal("\t<table>\n\t\t<tr>\n\t\t\t<td>1</td>\n\t\t\t<td>2"+
32
32
  "</td>\n\t\t\t<td>3</td>\n\t\t</tr>\n\t\t<tr>\n\t\t"+
33
33
  "\t<td>4</td>\n\t\t\t<td>5</td>\n\t\t\t<td>6</td>\n\t"+
34
34
  "\t</tr>\n\t</table>\n",actual)
35
35
 
36
- actual = Ruport::Controller::Table.render_html { |r|
37
- r.data = Table(%w[a b c], :data => [ [1,2,3],[4,5,6]])
36
+ actual = Ruport::Controller::Table.render_html { |r|
37
+ r.data = Ruport.Table(%w[a b c], :data => [ [1,2,3],[4,5,6]])
38
38
  }
39
-
40
- assert_equal("\t<table>\n\t\t<tr>\n\t\t\t<th>a</th>\n\t\t\t<th>b</th>"+
41
- "\n\t\t\t<th>c</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>1</td>"+
39
+
40
+ assert_equal("\t<table>\n\t\t<thead>\n\t\t<tr>\n\t\t\t<th>a</th>\n\t\t\t<th>b</th>"+
41
+ "\n\t\t\t<th>c</th>\n\t\t</tr>\n\t\t</thead>\n\t\t<tr>\n\t\t\t<td>1</td>"+
42
42
  "\n\t\t\t<td>2</td>\n\t\t\t<td>3</td>\n\t\t</tr>\n\t\t<tr>"+
43
43
  "\n\t\t\t<td>4</td>\n\t\t\t<td>5</td>\n\t\t\t<td>6</td>\n\t"+
44
- "\t</tr>\n\t</table>\n",actual)
45
-
44
+ "\t</tr>\n\t</table>\n",actual)
45
+
46
46
  end
47
-
47
+
48
48
  def test_render_with_template
49
49
  formatter = Ruport::Formatter::HTML.new
50
50
  formatter.options = Ruport::Controller::Options.new
51
51
  formatter.options.template = :simple
52
52
  formatter.apply_template
53
-
53
+
54
54
  assert_equal false, formatter.options.show_table_headers
55
55
 
56
56
  assert_equal :justified, formatter.options.style
@@ -59,7 +59,7 @@ class TestRenderHTMLTable < Test::Unit::TestCase
59
59
 
60
60
  def test_options_hashes_override_template
61
61
  opts = nil
62
- table = Table(%w[a b c])
62
+ table = Ruport.Table(%w[a b c])
63
63
  table.to_html(
64
64
  :template => :simple,
65
65
  :table_format => {
@@ -72,7 +72,7 @@ class TestRenderHTMLTable < Test::Unit::TestCase
72
72
  ) do |r|
73
73
  opts = r.options
74
74
  end
75
-
75
+
76
76
  assert_equal true, opts.show_table_headers
77
77
 
78
78
  assert_equal :inline, opts.style
@@ -81,7 +81,7 @@ class TestRenderHTMLTable < Test::Unit::TestCase
81
81
 
82
82
  def test_individual_options_override_template
83
83
  opts = nil
84
- table = Table(%w[a b c])
84
+ table = Ruport.Table(%w[a b c])
85
85
  table.to_html(
86
86
  :template => :simple,
87
87
  :show_table_headers => true,
@@ -90,35 +90,35 @@ class TestRenderHTMLTable < Test::Unit::TestCase
90
90
  ) do |r|
91
91
  opts = r.options
92
92
  end
93
-
93
+
94
94
  assert_equal true, opts.show_table_headers
95
95
 
96
96
  assert_equal :inline, opts.style
97
97
  assert_equal true, opts.show_group_headers
98
98
  end
99
99
  end
100
-
101
100
 
102
- class TestRenderHTMLRow < Test::Unit::TestCase
103
-
101
+
102
+ class TestRenderHTMLRow < Minitest::Test
103
+
104
104
  def test_render_html_row
105
105
  actual = Ruport::Controller::Row.render_html { |r| r.data = [1,2,3] }
106
106
  assert_equal("\t\t<tr>\n\t\t\t<td>1</td>\n\t\t\t<td>2"+
107
107
  "</td>\n\t\t\t<td>3</td>\n\t\t</tr>\n",actual)
108
108
  end
109
109
  end
110
-
111
110
 
112
- class TestRenderHTMLGroup < Test::Unit::TestCase
113
-
111
+
112
+ class TestRenderHTMLGroup < Minitest::Test
113
+
114
114
  def test_render_html_group
115
115
  group = Ruport::Data::Group.new(:name => 'test',
116
116
  :data => [[1,2,3],[4,5,6]],
117
117
  :column_names => %w[a b c])
118
118
  actual = Ruport::Controller::Group.render(:html, :data => group)
119
119
  assert_equal "\t<p>test</p>\n"+
120
- "\t<table>\n\t\t<tr>\n\t\t\t<th>a</th>\n\t\t\t<th>b</th>"+
121
- "\n\t\t\t<th>c</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>1</td>"+
120
+ "\t<table>\n\t\t<thead>\n\t\t<tr>\n\t\t\t<th>a</th>\n\t\t\t<th>b</th>"+
121
+ "\n\t\t\t<th>c</th>\n\t\t</tr>\n\t\t</thead>\n\t\t<tr>\n\t\t\t<td>1</td>"+
122
122
  "\n\t\t\t<td>2</td>\n\t\t\t<td>3</td>\n\t\t</tr>\n\t\t<tr>"+
123
123
  "\n\t\t\t<td>4</td>\n\t\t\t<td>5</td>\n\t\t\t<td>6</td>\n\t"+
124
124
  "\t</tr>\n\t</table>\n", actual
@@ -134,14 +134,14 @@ class TestRenderHTMLGroup < Test::Unit::TestCase
134
134
  "\n\t\t\t<td>2</td>\n\t\t\t<td>3</td>\n\t\t</tr>\n\t\t<tr>"+
135
135
  "\n\t\t\t<td>4</td>\n\t\t\t<td>5</td>\n\t\t\t<td>6</td>\n\t"+
136
136
  "\t</tr>\n\t</table>\n", actual
137
- end
137
+ end
138
138
  end
139
139
 
140
140
 
141
- class TestRenderHTMLGrouping < Test::Unit::TestCase
141
+ class TestRenderHTMLGrouping < Minitest::Test
142
142
 
143
143
  def test_render_html_grouping
144
- table = Table(%w[a b c]) << [1,2,3] << [1,1,3] << [2,7,9]
144
+ table = Ruport.Table(%w[a b c]) << [1,2,3] << [1,1,3] << [2,7,9]
145
145
  g = Grouping(table,:by => "a")
146
146
  actual = Ruport::Controller::Grouping.render(:html, :data => g,
147
147
  :show_table_headers => false)
@@ -153,27 +153,27 @@ class TestRenderHTMLGrouping < Test::Unit::TestCase
153
153
  end
154
154
 
155
155
  def test_render_html_grouping_with_table_headers
156
- table = Table(%w[a b c]) << [1,2,3] << [1,1,3] << [2,7,9]
156
+ table = Ruport.Table(%w[a b c]) << [1,2,3] << [1,1,3] << [2,7,9]
157
157
  g = Grouping(table,:by => "a")
158
158
  actual = Ruport::Controller::Grouping.render(:html, :data => g)
159
159
 
160
- assert_equal "\t<p>1</p>\n\t<table>\n\t\t<tr>\n\t\t\t<th>b</th>\n"+
161
- "\t\t\t<th>c</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>"+
160
+ assert_equal "\t<p>1</p>\n\t<table>\n\t\t<thead>\n\t\t<tr>\n\t\t\t<th>b</th>\n"+
161
+ "\t\t\t<th>c</th>\n\t\t</tr>\n\t\t</thead>\n\t\t<tr>\n\t\t\t<td>"+
162
162
  "2</td>\n\t\t\t<td>3</td>\n\t\t</tr>\n\t\t<tr>\n\t\t"+
163
163
  "\t<td>1</td>\n\t\t\t<td>3</td>\n\t\t</tr>\n\t</table>\n\n"+
164
- "\t<p>2</p>\n\t<table>\n\t\t<tr>\n\t\t\t<th>b</th>\n\t\t"+
165
- "\t<th>c</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t<td>7</td>\n"+
164
+ "\t<p>2</p>\n\t<table>\n\t\t<thead>\n\t\t<tr>\n\t\t\t<th>b</th>\n\t\t"+
165
+ "\t<th>c</th>\n\t\t</tr>\n\t\t</thead>\n\t\t<tr>\n\t\t\t<td>7</td>\n"+
166
166
  "\t\t\t<td>9</td>\n\t\t</tr>\n\t</table>\n\n", actual
167
167
  end
168
168
 
169
169
  def test_render_justified_html_grouping
170
- table = Table(%w[a b c]) << [1,2,3] << [1,1,3] << [2,7,9]
170
+ table = Ruport.Table(%w[a b c]) << [1,2,3] << [1,1,3] << [2,7,9]
171
171
  g = Grouping(table,:by => "a")
172
172
  actual = Ruport::Controller::Grouping.render(:html, :data => g,
173
173
  :style => :justified)
174
174
 
175
- assert_equal "\t<table>\n\t\t<tr>\n\t\t\t<th>a</th>\n\t\t\t<th>b</th>\n"+
176
- "\t\t\t<th>c</th>\n\t\t</tr>\n\t\t<tr>\n\t\t\t"+
175
+ assert_equal "\t<table>\n\t\t<thead>\n\t\t<tr>\n\t\t\t<th>a</th>\n\t\t\t<th>b</th>\n"+
176
+ "\t\t\t<th>c</th>\n\t\t</tr>\n\t\t</thead>\n\t\t<tr>\n\t\t\t"+
177
177
  "<td class=\"groupName\">1</td>\n\t\t\t<td>"+
178
178
  "2</td>\n\t\t\t<td>3</td>\n\t\t</tr>\n\t\t<tr>\n\t\t\t"+
179
179
  "<td>&nbsp;</td>\n\t\t\t<td>1</td>\n\t\t\t<td>3</td>"+
@@ -181,21 +181,21 @@ class TestRenderHTMLGrouping < Test::Unit::TestCase
181
181
  "<td class=\"groupName\">2</td>\n\t\t\t<td>7</td>\n"+
182
182
  "\t\t\t<td>9</td>\n\t\t</tr>\n\t</table>\n", actual
183
183
  end
184
- end
185
-
184
+ end
186
185
 
187
- class TestHTMLFormatterHelpers < Test::Unit::TestCase
186
+
187
+ class TestHTMLFormatterHelpers < Minitest::Test
188
188
  begin
189
189
  require "rubygems"
190
190
  rescue LoadError
191
191
  nil
192
192
  end
193
-
194
- def test_textile
193
+
194
+ def test_textile
195
195
  require "redcloth"
196
196
  a = Ruport::Formatter::HTML.new
197
197
  assert_equal "<p><strong>foo</strong></p>", a.textile("*foo*")
198
198
  rescue LoadError
199
- STDERR.puts "Skipping textile test... needs redcloth"
199
+ STDERR.puts "Skipping textile test... needs RedCloth gem"
200
200
  end
201
201
  end
@@ -0,0 +1,142 @@
1
+ # frozen_string_literal: true
2
+
3
+ require File.join(File.expand_path(File.dirname(__FILE__)), "helpers")
4
+
5
+ class TestRenderMarkdownTable < Minitest::Test
6
+ def test_render_markdown_table_basic
7
+ actual = Ruport::Controller::Table.render_markdown do |r|
8
+ r.data = Ruport::Table([:foo, :bar, :baz], data: [[1, 2, 3], [], [4, 5], [6]])
9
+ end
10
+
11
+ assert_equal([
12
+ "|foo|bar|baz|\n",
13
+ "|:--|:--|:--|\n",
14
+ "|1|2|3|\n",
15
+ "||||\n",
16
+ "|4|5||\n",
17
+ "|6|||\n"
18
+ ].join, actual)
19
+ end
20
+
21
+ def test_render_markdown_table_without_column_names
22
+ actual = Ruport::Controller::Table.render_markdown do |r|
23
+ r.data = Ruport::Table(data: [[:foo, :bar], [1, 2], [3, 4]])
24
+ end
25
+
26
+ assert_equal([
27
+ "|foo|bar|\n",
28
+ "|:--|:--|\n",
29
+ "|1|2|\n",
30
+ "|3|4|\n",
31
+ ].join, actual)
32
+
33
+ actual = Ruport::Controller::Table.render_markdown do |r|
34
+ r.data = Ruport::Table([], data: [[:foo, :bar], [1, 2], [3, 4]])
35
+ end
36
+
37
+ assert_equal([
38
+ "|foo|bar|\n",
39
+ "|:--|:--|\n",
40
+ "|1|2|\n",
41
+ "|3|4|\n",
42
+ ].join, actual)
43
+ end
44
+
45
+ def test_escape_virtical_bar
46
+ actual = Ruport::Controller::Table.render_markdown do |r|
47
+ r.data = Ruport::Table([:foo], data: [['foo0|foo1']])
48
+ end
49
+
50
+ assert_equal([
51
+ "|foo|\n",
52
+ "|:--|\n",
53
+ "|foo0&#124;foo1|\n"
54
+ ].join, actual)
55
+ end
56
+
57
+ def test_escape_newline_code
58
+ actual = Ruport::Controller::Table.render_markdown do |r|
59
+ r.data = Ruport::Table([:foo], data: [["foo0\nfoo1"]])
60
+ end
61
+
62
+ assert_equal([
63
+ "|foo|\n",
64
+ "|:--|\n",
65
+ "|foo0<br>foo1|\n"
66
+ ].join, actual)
67
+ end
68
+
69
+ def test_alignment_option
70
+ actual = Ruport::Controller::Table.render_markdown(alignment: :left) do |r|
71
+ r.data = Ruport::Table([:foo, :bar], data: [[1, 2], [3, 4]])
72
+ end
73
+
74
+ assert_equal([
75
+ "|foo|bar|\n",
76
+ "|:--|:--|\n",
77
+ "|1|2|\n",
78
+ "|3|4|\n"
79
+ ].join, actual)
80
+
81
+ actual = Ruport::Controller::Table.render_markdown(alignment: :center) do |r|
82
+ r.data = Ruport::Table([:foo, :bar], data: [[1, 2], [3, 4]])
83
+ end
84
+
85
+ assert_equal([
86
+ "|foo|bar|\n",
87
+ "|:-:|:-:|\n",
88
+ "|1|2|\n",
89
+ "|3|4|\n"
90
+ ].join, actual)
91
+
92
+ actual = Ruport::Controller::Table.render_markdown(alignment: :right) do |r|
93
+ r.data = Ruport::Table([:foo, :bar], data: [[1, 2], [3, 4]])
94
+ end
95
+
96
+ assert_equal([
97
+ "|foo|bar|\n",
98
+ "|--:|--:|\n",
99
+ "|1|2|\n",
100
+ "|3|4|\n"
101
+ ].join, actual)
102
+ end
103
+
104
+ def test_column_alignments_option
105
+ actual = Ruport::Controller::Table.render_markdown(
106
+ column_alignments: { foo: :left, bar: :right, baz: :center }
107
+ ) do |r|
108
+ r.data = Ruport::Table([:foo, :bar, :baz, :qux], data: [[1, 2, 3, 4], [5, 6, 7, 8]])
109
+ end
110
+
111
+ assert_equal([
112
+ "|foo|bar|baz|qux|\n",
113
+ "|:--|--:|:-:|:--|\n",
114
+ "|1|2|3|4|\n",
115
+ "|5|6|7|8|\n"
116
+ ].join, actual)
117
+ end
118
+
119
+ def test_options_hash_override_template
120
+ Ruport::Formatter::Template.create(:a_template) do |format|
121
+ format.table = {
122
+ alignment: :center,
123
+ column_alignments: { foo: :right }
124
+ }
125
+ end
126
+
127
+ actual = Ruport::Controller::Table.render_markdown(
128
+ template: :a_template,
129
+ alignment: :right,
130
+ column_alignments: { foo: :left, bar: :center }
131
+ ) do |r|
132
+ r.data = Ruport::Table([:foo, :bar, :baz], data: [[1, 2, 3], [4, 5, 6]])
133
+ end
134
+
135
+ assert_equal([
136
+ "|foo|bar|baz|\n",
137
+ "|:--|:-:|--:|\n",
138
+ "|1|2|3|\n",
139
+ "|4|5|6|\n"
140
+ ].join, actual)
141
+ end
142
+ end
@@ -0,0 +1,108 @@
1
+ #!/usr/bin/env ruby -w
2
+
3
+ require_relative 'helpers'
4
+
5
+ class TestRenderPDFTable < Minitest::Test
6
+
7
+ def setup
8
+ Ruport::Formatter::Template.create(:simple) do |format|
9
+ format.page = {
10
+ size: "LETTER",
11
+ layout: :landscape
12
+ }
13
+ format.text = {
14
+ font_size: 16
15
+ }
16
+ format.table = {
17
+ show_headings: false
18
+ }
19
+ format.column = {
20
+ alignment: :center,
21
+ width: 50
22
+ }
23
+ format.heading = {
24
+ alignment: :right,
25
+ bold: false,
26
+ title: "Test"
27
+ }
28
+ format.grouping = {
29
+ style: :separated
30
+ }
31
+ end
32
+ end
33
+
34
+ def test_render_pdf_errors
35
+ # can't render without column names
36
+ data = Ruport.Table([], data: [[1,2],[3,4]])
37
+ assert_raises(Ruport::FormatterError) do
38
+ data.to_prawn_pdf
39
+ end
40
+
41
+ data.column_names = %w[a b]
42
+
43
+ data.to_prawn_pdf
44
+ end
45
+
46
+ def test_render_pdf_basic
47
+ expected_output = IO.binread(File.join(__dir__, 'expected_outputs/prawn_pdf_formatter/pdf_basic.pdf.test')).bytes
48
+
49
+ data = Ruport.Table(%w[a b c], data: [[1,2,3]])
50
+ # debugging:
51
+ # data.to_prawn_pdf(:file => File.join(__dir__, 'expected_outputs/prawn_pdf_formatter/pdf_actual.pdf.test'))
52
+ actual_output = data.to_prawn_pdf.bytes
53
+
54
+ assert_equal expected_output, actual_output
55
+ end
56
+
57
+ # this is mostly to check that the transaction hack gets called
58
+ def test_relatively_large_pdf
59
+ table = Ruport.Table(File.join(File.expand_path(File.dirname(__FILE__)), "../test/",
60
+ %w[samples dates.csv]))
61
+ table.reduce(0..99)
62
+ table.to_prawn_pdf
63
+ end
64
+
65
+ #--------BUG TRAPS--------#
66
+
67
+ # PDF::SimpleTable does not handle symbols as column names
68
+ # Ruport should smartly fix this surprising behaviour (#283)
69
+ def test_tables_should_render_with_symbol_column_name
70
+ data = Ruport.Table([:a,:b,:c], data: [[1,2,3],[4,5,6]])
71
+ data.to_prawn_pdf
72
+ end
73
+
74
+ end
75
+
76
+ class TestRenderPDFGrouping < Minitest::Test
77
+
78
+ #--------BUG TRAPS----------#
79
+
80
+ def test_grouping_should_have_consistent_font_size
81
+ a = Ruport.Table(%w[a b c]) << %w[eye like chicken] << %w[eye like liver] <<
82
+ %w[meow mix meow ] << %w[mix please deliver ]
83
+ b = Grouping(a, by: "a")
84
+ splat = b.to_prawn_pdf.split("\n")
85
+ splat.grep(/meow/).each do |m|
86
+ assert_equal '10.0', m.split[5]
87
+ end
88
+ splat.grep(/mix/).each do |m|
89
+ assert_equal '10.0', m.split[5]
90
+ end
91
+ splat.grep(/eye/).each do |m|
92
+ assert_equal '10.0', m.split[5]
93
+ end
94
+ end
95
+
96
+ end
97
+
98
+ class TestPDFFormatterHelpers < Minitest::Test
99
+
100
+ def test_move_up
101
+ a = Ruport::Formatter::PrawnPDF.new
102
+ a.move_cursor_to(500)
103
+ a.move_up(50)
104
+ assert_equal(550,a.cursor)
105
+ a.move_down(100)
106
+ assert_equal(450,a.cursor)
107
+ end
108
+ end