gruff 0.5.1-java → 0.10.0-java

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 (120) hide show
  1. checksums.yaml +5 -5
  2. data/.editorconfig +14 -0
  3. data/.github/ISSUE_TEMPLATE.md +18 -0
  4. data/.gitignore +3 -0
  5. data/.rubocop.yml +109 -0
  6. data/.rubocop_todo.yml +130 -0
  7. data/.travis.yml +24 -12
  8. data/.yardopts +1 -0
  9. data/{History.txt → CHANGELOG.md} +61 -25
  10. data/Gemfile +3 -7
  11. data/README.md +57 -25
  12. data/Rakefile +6 -201
  13. data/assets/plastik/blue.png +0 -0
  14. data/assets/plastik/green.png +0 -0
  15. data/assets/plastik/red.png +0 -0
  16. data/docker/Dockerfile +14 -0
  17. data/docker/build.sh +4 -0
  18. data/docker/launch.sh +4 -0
  19. data/gruff.gemspec +19 -14
  20. data/init.rb +2 -0
  21. data/lib/gruff.rb +26 -2
  22. data/lib/gruff/accumulator_bar.rb +18 -8
  23. data/lib/gruff/area.rb +33 -19
  24. data/lib/gruff/bar.rb +76 -45
  25. data/lib/gruff/base.rb +337 -613
  26. data/lib/gruff/bezier.rb +34 -19
  27. data/lib/gruff/bullet.rb +51 -62
  28. data/lib/gruff/dot.rb +38 -62
  29. data/lib/gruff/helper/bar_conversion.rb +47 -0
  30. data/lib/gruff/helper/bar_value_label_mixin.rb +30 -0
  31. data/lib/gruff/helper/stacked_mixin.rb +23 -0
  32. data/lib/gruff/histogram.rb +59 -0
  33. data/lib/gruff/line.rb +130 -150
  34. data/lib/gruff/mini/bar.rb +17 -10
  35. data/lib/gruff/mini/legend.rb +24 -36
  36. data/lib/gruff/mini/pie.rb +18 -12
  37. data/lib/gruff/mini/side_bar.rb +26 -12
  38. data/lib/gruff/net.rb +60 -84
  39. data/lib/gruff/patch/rmagick.rb +33 -0
  40. data/lib/gruff/patch/string.rb +10 -0
  41. data/lib/gruff/photo_bar.rb +27 -30
  42. data/lib/gruff/pie.rb +190 -93
  43. data/lib/gruff/renderer/bezier.rb +21 -0
  44. data/lib/gruff/renderer/circle.rb +21 -0
  45. data/lib/gruff/renderer/dash_line.rb +22 -0
  46. data/lib/gruff/renderer/dot.rb +39 -0
  47. data/lib/gruff/renderer/ellipse.rb +21 -0
  48. data/lib/gruff/renderer/line.rb +34 -0
  49. data/lib/gruff/renderer/polygon.rb +23 -0
  50. data/lib/gruff/renderer/polyline.rb +21 -0
  51. data/lib/gruff/renderer/rectangle.rb +19 -0
  52. data/lib/gruff/renderer/renderer.rb +127 -0
  53. data/lib/gruff/renderer/text.rb +42 -0
  54. data/lib/gruff/scatter.rb +156 -180
  55. data/lib/gruff/scene.rb +31 -41
  56. data/lib/gruff/side_bar.rb +77 -63
  57. data/lib/gruff/side_stacked_bar.rb +77 -60
  58. data/lib/gruff/spider.rb +37 -50
  59. data/lib/gruff/stacked_area.rb +32 -30
  60. data/lib/gruff/stacked_bar.rb +87 -49
  61. data/lib/gruff/store/base_data.rb +34 -0
  62. data/lib/gruff/store/custom_data.rb +34 -0
  63. data/lib/gruff/store/store.rb +80 -0
  64. data/lib/gruff/store/xy_data.rb +55 -0
  65. data/lib/gruff/themes.rb +32 -33
  66. data/lib/gruff/version.rb +3 -1
  67. metadata +88 -94
  68. data/Manifest.txt +0 -81
  69. data/RELEASE.md +0 -30
  70. data/assets/bubble.png +0 -0
  71. data/assets/city_scene/background/0000.png +0 -0
  72. data/assets/city_scene/background/0600.png +0 -0
  73. data/assets/city_scene/background/2000.png +0 -0
  74. data/assets/city_scene/clouds/cloudy.png +0 -0
  75. data/assets/city_scene/clouds/partly_cloudy.png +0 -0
  76. data/assets/city_scene/clouds/stormy.png +0 -0
  77. data/assets/city_scene/grass/default.png +0 -0
  78. data/assets/city_scene/haze/true.png +0 -0
  79. data/assets/city_scene/number_sample/1.png +0 -0
  80. data/assets/city_scene/number_sample/2.png +0 -0
  81. data/assets/city_scene/number_sample/default.png +0 -0
  82. data/assets/city_scene/sky/0000.png +0 -0
  83. data/assets/city_scene/sky/0200.png +0 -0
  84. data/assets/city_scene/sky/0400.png +0 -0
  85. data/assets/city_scene/sky/0600.png +0 -0
  86. data/assets/city_scene/sky/0800.png +0 -0
  87. data/assets/city_scene/sky/1000.png +0 -0
  88. data/assets/city_scene/sky/1200.png +0 -0
  89. data/assets/city_scene/sky/1400.png +0 -0
  90. data/assets/city_scene/sky/1500.png +0 -0
  91. data/assets/city_scene/sky/1700.png +0 -0
  92. data/assets/city_scene/sky/2000.png +0 -0
  93. data/assets/pc306715.jpg +0 -0
  94. data/lib/gruff/bar_conversion.rb +0 -46
  95. data/lib/gruff/deprecated.rb +0 -39
  96. data/lib/gruff/stacked_mixin.rb +0 -23
  97. data/test/gruff_test_case.rb +0 -154
  98. data/test/image_compare.rb +0 -58
  99. data/test/test_accumulator_bar.rb +0 -51
  100. data/test/test_area.rb +0 -134
  101. data/test/test_bar.rb +0 -505
  102. data/test/test_base.rb +0 -8
  103. data/test/test_bezier.rb +0 -33
  104. data/test/test_bullet.rb +0 -26
  105. data/test/test_dot.rb +0 -263
  106. data/test/test_legend.rb +0 -68
  107. data/test/test_line.rb +0 -657
  108. data/test/test_mini_bar.rb +0 -33
  109. data/test/test_mini_pie.rb +0 -25
  110. data/test/test_mini_side_bar.rb +0 -36
  111. data/test/test_net.rb +0 -231
  112. data/test/test_photo.rb +0 -41
  113. data/test/test_pie.rb +0 -154
  114. data/test/test_scatter.rb +0 -233
  115. data/test/test_scene.rb +0 -100
  116. data/test/test_side_bar.rb +0 -56
  117. data/test/test_sidestacked_bar.rb +0 -105
  118. data/test/test_spider.rb +0 -226
  119. data/test/test_stacked_area.rb +0 -52
  120. data/test/test_stacked_bar.rb +0 -52
@@ -1,8 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- require File.dirname(__FILE__) + "/gruff_test_case"
4
-
5
- class TestGruffBase < GruffTestCase
6
-
7
-
8
- end
@@ -1,33 +0,0 @@
1
- require File.dirname(__FILE__) + "/gruff_test_case"
2
-
3
- class TestBezier < GruffTestCase
4
-
5
- def setup
6
- @data_args = [75, 100, {
7
- :target => 80,
8
- :low => 50,
9
- :high => 90
10
- }]
11
- end
12
-
13
- def test_bezier
14
- g = Gruff::Bezier.new
15
- g.title = "Bezier?"
16
- g.data 'Series 1', [0, 100]
17
- g.write("test/output/bezier.png")
18
- end
19
-
20
- def test_bezier_2
21
- g = Gruff::Bezier.new
22
- g.data 'Series 2', [0, 127, 150]
23
- g.write("test/output/bezier_2.png")
24
- end
25
-
26
- def test_bezier_3
27
- g = Gruff::Bezier.new
28
- g.data 'Series 3', [100,300,200,250]
29
- g.minimum_value = 0
30
- g.write("test/output/bezier_3.png")
31
- end
32
-
33
- end
@@ -1,26 +0,0 @@
1
- require File.dirname(__FILE__) + "/gruff_test_case"
2
-
3
- class TestGruffBullet < GruffTestCase
4
-
5
- def setup
6
- @data_args = [75, 100, {
7
- :target => 80,
8
- :low => 50,
9
- :high => 90
10
- }]
11
- end
12
-
13
- def test_bullet_graph
14
- g = Gruff::Bullet.new
15
- g.title = "Monthly Revenue"
16
- g.data *@data_args
17
- g.write("test/output/bullet_greyscale.png")
18
- end
19
-
20
- def test_no_options
21
- g = Gruff::Bullet.new
22
- g.data *@data_args
23
- g.write("test/output/bullet_no_options.png")
24
- end
25
-
26
- end
@@ -1,263 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- require File.dirname(__FILE__) + '/gruff_test_case'
4
-
5
- class TestGruffDot < GruffTestCase
6
-
7
- # TODO Delete old output files once when starting tests
8
-
9
- def setup
10
- @datasets = [
11
- [:Jimmy, [25, 36, 86, 39]],
12
- [:Charles, [80, 54, 67, 54]],
13
- [:Julie, [22, 29, 35, 38]],
14
- #[:Jane, [95, 95, 95, 90, 85, 80, 88, 100]],
15
- #[:Philip, [90, 34, 23, 12, 78, 89, 98, 88]],
16
- #["Arthur", [5, 10, 13, 11, 6, 16, 22, 32]],
17
- ]
18
- end
19
-
20
- def test_dot_graph
21
- g = setup_basic_graph
22
- g.title = 'Dot Graph Test'
23
- g.write('test/output/dot.png')
24
- end
25
-
26
- def test_dot_graph_set_colors
27
- g = Gruff::Dot.new
28
- g.title = 'Dot Graph With Manual Colors'
29
- g.labels = {
30
- 0 => '5/6',
31
- 1 => '5/15',
32
- 2 => '5/24',
33
- 3 => '5/30',
34
- }
35
- g.data(:Art, [0, 5, 8, 15], '#990000')
36
- g.data(:Philosophy, [10, 3, 2, 8], '#009900')
37
- g.data(:Science, [2, 15, 8, 11], '#990099')
38
-
39
- g.minimum_value = 0
40
-
41
- g.write('test/output/dot_manual_colors.png')
42
- end
43
-
44
- def test_dot_graph_small
45
- g = setup_basic_graph(400)
46
- g.title = 'Visual Multi-Line Dot Graph Test'
47
- g.write('test/output/dot_small.png')
48
- end
49
-
50
- # Somewhat worthless test. Should an error be thrown?
51
- # def test_nil_font
52
- # g = setup_basic_graph 400
53
- # g.title = "Nil Font"
54
- # g.font = nil
55
- # g.write "test/output/dot_nil_font.png"
56
- # end
57
-
58
-
59
- def test_no_line_markers
60
- g = setup_basic_graph(400)
61
- g.title = 'No Line Markers'
62
- g.hide_line_markers = true
63
- g.write('test/output/dot_no_line_markers.png')
64
- end
65
-
66
- def test_no_legend
67
- g = setup_basic_graph(400)
68
- g.title = 'No Legend'
69
- g.hide_legend = true
70
- g.write('test/output/dot_no_legend.png')
71
- end
72
-
73
- def test_no_title
74
- g = setup_basic_graph(400)
75
- g.title = 'No Title'
76
- g.hide_title = true
77
- g.write('test/output/dot_no_title.png')
78
- end
79
-
80
- def test_no_title_or_legend
81
- g = setup_basic_graph(400)
82
- g.title = 'No Title or Legend'
83
- g.hide_legend = true
84
- g.hide_title = true
85
- g.write('test/output/dot_no_title_or_legend.png')
86
- end
87
-
88
- def test_set_marker_count
89
- g = setup_basic_graph(400)
90
- g.title = 'Set marker'
91
- g.marker_count = 10
92
- g.write('test/output/dot_set_marker.png')
93
- end
94
-
95
- def test_set_legend_box_size
96
- g = setup_basic_graph(400)
97
- g.title = 'Set Small Legend Box Size'
98
- g.legend_box_size = 10.0
99
- g.write('test/output/dot_set_legend_box_size_sm.png')
100
-
101
- g = setup_basic_graph(400)
102
- g.title = 'Set Large Legend Box Size'
103
- g.legend_box_size = 50.0
104
- g.write('test/output/dot_set_legend_box_size_lg.png')
105
- end
106
-
107
- def test_x_y_labels
108
- g = setup_basic_graph(400)
109
- g.title = 'X Y Labels'
110
- g.x_axis_label = 'Score (%)'
111
- g.y_axis_label = 'Students'
112
- g.write('test/output/dot_x_y_labels.png')
113
- end
114
-
115
- def test_wide_graph
116
- g = setup_basic_graph('800x400')
117
- g.title = 'Wide Graph'
118
- g.write('test/output/dot_wide_graph.png')
119
-
120
- g = setup_basic_graph('400x200')
121
- g.title = 'Wide Graph Small'
122
- g.write('test/output/dot_wide_graph_small.png')
123
- end
124
-
125
-
126
- def test_tall_graph
127
- g = setup_basic_graph('400x600')
128
- g.title = 'Tall Graph'
129
- g.write('test/output/dot_tall_graph.png')
130
-
131
- g = setup_basic_graph('200x400')
132
- g.title = 'Tall Graph Small'
133
- g.write('test/output/dot_tall_graph_small.png')
134
- end
135
-
136
-
137
- def test_one_value
138
- g = Gruff::Dot.new
139
- g.title = 'One Value Graph Test'
140
- g.labels = {
141
- 0 => '1',
142
- 1 => '2'
143
- }
144
- g.data('one', [1,1])
145
-
146
- g.write('test/output/dot_one_value.png')
147
- end
148
-
149
-
150
- def test_negative
151
- g = Gruff::Dot.new
152
- g.title = 'Pos/Neg Dot Graph Test'
153
- g.labels = {
154
- 0 => '5/6',
155
- 1 => '5/15',
156
- 2 => '5/24',
157
- 3 => '5/30',
158
- }
159
- g.data(:apples, [-1, 0, 4, -4])
160
- g.data(:peaches, [10, 8, 6, 3])
161
-
162
- g.write('test/output/dot_pos_neg.png')
163
- end
164
-
165
-
166
- def test_nearly_zero
167
- g = Gruff::Dot.new
168
- g.title = 'Nearly Zero Graph'
169
- g.labels = {
170
- 0 => '5/6',
171
- 1 => '5/15',
172
- 2 => '5/24',
173
- 3 => '5/30',
174
- }
175
- g.data(:apples, [1, 2, 3, 4])
176
- g.data(:peaches, [4, 3, 2, 1])
177
- g.minimum_value = 0
178
- g.maximum_value = 10
179
- g.write('test/output/dot_nearly_zero_max_10.png')
180
- end
181
-
182
- def test_y_axis_increment
183
- generate_with_y_axis_increment 2.0
184
- generate_with_y_axis_increment 1
185
- generate_with_y_axis_increment 5
186
- generate_with_y_axis_increment 20
187
- end
188
-
189
- def generate_with_y_axis_increment(increment)
190
- g = Gruff::Dot.new
191
- g.title = "Y Axis Set to #{increment}"
192
- g.labels = {
193
- 0 => '5/6',
194
- 1 => '5/15',
195
- 2 => '5/24',
196
- 3 => '5/30',
197
- }
198
- g.y_axis_increment = increment
199
- g.data(:apples, [1, 0.2, 0.5, 0.7])
200
- g.data(:peaches, [2.5, 2.3, 2, 6.1])
201
- g.write("test/output/dot_y_increment_#{increment}.png")
202
- end
203
-
204
-
205
- def test_custom_theme
206
- g = Gruff::Dot.new
207
- g.title = 'Custom Theme'
208
- g.font = File.expand_path('CREABBRG.TTF', ENV['MAGICK_FONT_PATH'])
209
- g.title_font_size = 60
210
- g.legend_font_size = 32
211
- g.marker_font_size = 32
212
- g.theme = {
213
- :colors => %w(#efd250 #666699 #e5573f #9595e2),
214
- :marker_color => 'white',
215
- :font_color => 'blue',
216
- :background_image => 'assets/pc306715.jpg'
217
- }
218
- g.labels = {
219
- 0 => '5/6',
220
- 1 => '5/15',
221
- 2 => '5/24',
222
- 3 => '5/30',
223
- }
224
- g.data(:vancouver, [1, 2, 3, 4])
225
- g.data(:seattle, [2, 4, 6, 8])
226
- g.data(:portland, [3, 1, 7, 3])
227
- g.data(:victoria, [4, 3, 5, 7])
228
- g.minimum_value = 0
229
- g.write('test/output/dot_themed.png')
230
- end
231
-
232
- def test_july_enhancements
233
- g = Gruff::Dot.new(600)
234
- g.hide_legend = true
235
- g.title = 'Full speed ahead'
236
- g.labels = (0..10).inject({}) { |memo, i| memo.merge({ i => (i*10).to_s}) }
237
- g.data(:apples, (0..9).map { rand(20)/10.0 })
238
- g.y_axis_increment = 1.0
239
- g.x_axis_label = 'Score (%)'
240
- g.y_axis_label = 'Students'
241
- write_test_file g, 'enhancements.png'
242
- end
243
-
244
-
245
- protected
246
-
247
- def setup_basic_graph(size=800)
248
- g = Gruff::Dot.new(size)
249
- g.title = 'My Dot Graph'
250
- g.labels = {
251
- 0 => '5/6',
252
- 1 => '5/15',
253
- 2 => '5/24',
254
- 3 => '5/30',
255
- }
256
- @datasets.each do |data|
257
- g.data(data[0], data[1])
258
- end
259
- g
260
- end
261
-
262
- end
263
-
@@ -1,68 +0,0 @@
1
- require File.dirname(__FILE__) + '/gruff_test_case'
2
-
3
- class TestGruffLegend < GruffTestCase
4
-
5
- def setup
6
- @datasets = [
7
- [:Jimmy, [25, 36, 86, 39, 25, 31, 79, 88]],
8
- [:Charles, [80, 54, 67, 54, 68, 70, 90, 95]],
9
- [:Julie, [22, 29, 35, 38, 36, 40, 46, 57]],
10
- [:Jane, [95, 95, 95, 90, 85, 80, 88, 100]],
11
- [:Philip, [90, 34, 23, 12, 78, 89, 98, 88]],
12
- [:Arthur, [5, 10, 13, 11, 6, 16, 22, 32]],
13
- [:Vincent, [5, 10, 13, 11, 6, 16, 22, 32]],
14
- [:Jake, [5, 10, 13, 11, 6, 16, 22, 32]],
15
- [:Stephen, [5, 10, 13, 11, 6, 16, 22, 32]],
16
- ]
17
-
18
- @sample_labels = {
19
- 0 => '5/6',
20
- 1 => '5/15',
21
- 2 => '5/24',
22
- 3 => '5/30',
23
- 4 => '6/4',
24
- 5 => '6/12',
25
- 6 => '6/21',
26
- 7 => '6/28',
27
- }
28
- end
29
-
30
- def full_suite_for(name, type)
31
- [800, 400].each do |width|
32
- [nil, 4, 16, 30].each do |font_size|
33
- g = type.new(width)
34
- g.title = "Wrapped Legend Bar Test #{font_size}pts #{width}px"
35
- g.labels = @sample_labels
36
- 0xEFD250.step(0xFF0000, 60) do |num|
37
- g.colors << '#%x' % num
38
- end
39
-
40
- @datasets.each do |data|
41
- g.data(data[0], data[1])
42
- end
43
-
44
- g.legend_font_size = font_size unless font_size.nil?
45
- g.write("test/output/#{name}_wrapped_legend_#{font_size}_#{width}.png")
46
- end
47
- end
48
- end
49
-
50
- def test_bar_legend_wrap
51
- full_suite_for(:bar, Gruff::Bar)
52
- end
53
-
54
- def test_pie_legend_wrap
55
- full_suite_for(:pie, Gruff::Pie)
56
- end
57
-
58
- def test_more_than_two_lines_of_legends
59
- @datasets = @datasets + [[:Julie2, [22, 29, 35, 38, 36, 40, 46, 57]],
60
- [:Jane2, [95, 95, 95, 90, 85, 80, 88, 100]],
61
- [:Philip2, [90, 34, 23, 12, 78, 89, 98, 88]],
62
- [:Arthur2, [5, 10, 13, 11, 6, 16, 22, 32]],
63
- [:Vincent2, [5, 10, 13, 11, 6, 16, 22, 32]],
64
- [:Jake2, [5, 10, 13, 11, 6, 16, 22, 32]],
65
- [:Stephen2, [5, 10, 13, 11, 6, 16, 22, 32]]]
66
- full_suite_for(:bar2, Gruff::Bar)
67
- end
68
- end
@@ -1,657 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- require File.dirname(__FILE__) + '/gruff_test_case'
4
-
5
- class TestGruffLine < GruffTestCase
6
- def test_should_render_with_transparent_theme
7
- g = Gruff::Line.new(400)
8
- g.title = 'Transparent Background'
9
- g.theme = {
10
- :colors => %w(black grey),
11
- :marker_color => 'grey',
12
- :font_color => 'black',
13
- :background_colors => 'transparent'
14
- }
15
-
16
- g.labels = {
17
- 0 => '5/6',
18
- 1 => '5/15',
19
- 2 => '5/24',
20
- 3 => '5/30',
21
- }
22
- g.data(:apples, [-1, 0, 4, -4])
23
- g.data(:peaches, [10, 8, 6, 3])
24
- g.write('test/output/line_transparent.png')
25
- end
26
-
27
- def test_very_small
28
- g = Gruff::Line.new(200)
29
- g.title = 'Very Small Line Chart 200px'
30
- g.labels = @labels
31
- @datasets.each do |data|
32
- g.data(data[0], data[1])
33
- end
34
- g.write('test/output/line_very_small.png')
35
- end
36
-
37
- def test_line_graph_with_themes
38
- line_graph_with_themes()
39
- line_graph_with_themes(400)
40
- end
41
-
42
- def test_one_value
43
- g = Gruff::Line.new
44
- g.title = 'One Value'
45
- g.labels = {
46
- 0 => '1',
47
- 1 => '2'
48
- }
49
- g.data('one', 1)
50
-
51
- g.write('test/output/line_one_value.png')
52
- end
53
-
54
- def test_one_value_array
55
- g = Gruff::Line.new
56
- g.title = 'One Value in an Array'
57
- g.labels = {
58
- 0 => '1',
59
- 1 => '2'
60
- }
61
- g.data('one', [1])
62
-
63
- g.write('test/output/line_one_value_array.png')
64
- end
65
-
66
-
67
- def test_should_not_hang_with_0_0_100
68
- g = Gruff::Line.new(320)
69
- g.title = 'Hang Value Graph Test'
70
- g.data('test', [0, 0, 100])
71
-
72
- g.write('test/output/line_hang_value.png')
73
- end
74
-
75
- # TODO
76
- # def test_fix_crash
77
- # g = Gruff::Line.new(370)
78
- # g.title = "Crash Test"
79
- # g.data "ichi", [5]
80
- # g.data "ni", [0]
81
- # g.data "san", [0]
82
- # g.data "shi", [0]
83
- # g.write("test/output/line_crash_fix_test.png")
84
- # end
85
-
86
-
87
- def test_line_small_values
88
- @datasets = [
89
- [:small, [0.1, 0.14356, 0.0, 0.5674839, 0.456]],
90
- [:small2, [0.2, 0.3, 0.1, 0.05, 0.9]]
91
- ]
92
-
93
- g = Gruff::Line.new
94
- g.title = 'Small Values Line Graph Test'
95
- @datasets.each do |data|
96
- g.data(data[0], data[1])
97
- end
98
- g.write('test/output/line_small_values.png')
99
-
100
- g = Gruff::Line.new(400)
101
- g.title = 'Small Values Line Graph Test 400px'
102
- @datasets.each do |data|
103
- g.data(data[0], data[1])
104
- end
105
- g.write('test/output/line_small_values_small.png')
106
- end
107
-
108
- def test_line_starts_with_zero
109
- @datasets = [
110
- [:first0, [0, 5, 10, 8, 18]],
111
- [:normal, [1, 2, 3, 4, 5]]
112
- ]
113
-
114
- g = Gruff::Line.new
115
- g.title = 'Small Values Line Graph Test'
116
- @datasets.each do |data|
117
- g.data(data[0], data[1])
118
- end
119
- g.write('test/output/line_small_zero.png')
120
-
121
- g = Gruff::Line.new(400)
122
- g.title = 'Small Values Line Graph Test 400px'
123
- @datasets.each do |data|
124
- g.data(data[0], data[1])
125
- end
126
- g.write('test/output/line_small_small_zero.png')
127
- end
128
-
129
-
130
- def test_line_large_values
131
- @datasets = [
132
- [:large, [100_005, 35_000, 28_000, 27_000]],
133
- [:large2, [35_000, 28_000, 27_000, 100_005]],
134
- [:large3, [28_000, 27_000, 100_005, 35_000]],
135
- [:large4, [1_238, 39_092, 27_938, 48_876]]
136
- ]
137
-
138
- g = Gruff::Line.new
139
- g.title = 'Very Large Values Line Graph Test'
140
- g.baseline_value = 50_000
141
- g.baseline_color = 'green'
142
- g.dot_radius = 15
143
- g.line_width = 3
144
- @datasets.each do |data|
145
- g.data(data[0], data[1])
146
- end
147
-
148
- g.write('test/output/line_large.png')
149
- end
150
-
151
- # def test_long_title
152
- #
153
- # end
154
- #
155
- # def test_add_colors
156
- #
157
- # end
158
- #
159
-
160
- def test_request_too_many_colors
161
- g = Gruff::Line.new
162
- g.title = 'More Sets Than in Color Array'
163
- # g.theme = {} # Sets theme with only black and white
164
- @datasets.each do |data|
165
- g.data(data[0], data[1])
166
- end
167
- @datasets.each do |data|
168
- g.data("#{data[0]}-B", data[1].map { |d| d + 20 })
169
- end
170
- g.write('test/output/line_more_sets_than_colors.png')
171
- end
172
-
173
- #
174
- # def test_add_data
175
- #
176
- # end
177
-
178
- def test_many_datapoints
179
- g = Gruff::Line.new
180
- g.title = 'Many Multi-Line Graph Test'
181
- g.labels = {
182
- 0 => 'June',
183
- 10 => 'July',
184
- 30 => 'August',
185
- 50 => 'September',
186
- }
187
- g.data('many points', (0..50).collect { |i| rand(100) })
188
- g.x_axis_label = 'Months'
189
-
190
- # Default theme
191
- g.write('test/output/line_many.png')
192
- end
193
-
194
-
195
- def test_similar_high_end_values
196
- @dataset = %w(29.43 29.459 29.498 29.53 29.548 29.589 29.619 29.66 29.689 29.849 29.878 29.74 29.769 29.79 29.808 29.828).collect { |i| i.to_f }
197
-
198
- g = Gruff::Line.new
199
- g.title = 'Similar High End Values Test'
200
- g.data('similar points', @dataset)
201
- g.write('test/output/line_similar_high_end_values.png')
202
-
203
- g = Gruff::Line.new
204
- g.title = 'Similar High End Values With Floor'
205
- g.data('similar points', @dataset)
206
- g.minimum_value = 0
207
- g.y_axis_label = 'Barometric Pressure'
208
- g.write('test/output/line_similar_high_end_values_with_floor.png')
209
- end
210
-
211
- def test_many_lines_graph_small
212
- g = Gruff::Line.new(400)
213
- g.title = 'Many Values Line Test 400px'
214
- g.labels = {
215
- 0 => '5/6',
216
- 10 => '5/15',
217
- 20 => '5/24',
218
- 30 => '5/30',
219
- 40 => '6/4',
220
- 50 => '6/16'
221
- }
222
- %w{jimmy jane philip arthur julie bert}.each do |student_name|
223
- g.data(student_name, (0..50).collect { |i| rand 100 })
224
- end
225
-
226
- # Default theme
227
- g.write('test/output/line_many_lines_small.png')
228
- end
229
-
230
- def test_graph_tiny
231
- g = Gruff::Line.new(300)
232
- g.title = 'Tiny Test 300px'
233
- g.labels = {
234
- 0 => '5/6',
235
- 10 => '5/15',
236
- 20 => '5/24',
237
- 30 => '5/30',
238
- 40 => '6/4',
239
- 50 => '6/16'
240
- }
241
- %w{jimmy jane philip arthur julie bert}.each do |student_name|
242
- g.data(student_name, (0..50).collect { |i| rand 100 })
243
- end
244
-
245
- # Default theme
246
- g.write('test/output/line_tiny.png')
247
- end
248
-
249
- def test_no_data
250
- g = Gruff::Line.new(400)
251
- g.title = 'No Data'
252
- # Default theme
253
- g.write('test/output/line_no_data.png')
254
-
255
- g = Gruff::Line.new(400)
256
- g.title = 'No Data Title'
257
- g.no_data_message = 'There is no data'
258
- g.write('test/output/line_no_data_msg.png')
259
- end
260
-
261
-
262
- def test_all_zeros
263
- g = Gruff::Line.new(400)
264
- g.title = 'All Zeros'
265
-
266
- g.data(:gus, [0, 0, 0, 0])
267
-
268
- # Default theme
269
- g.write('test/output/line_no_data_other.png')
270
- end
271
-
272
-
273
- def test_some_nil_points
274
- g = Gruff::Line.new
275
- g.title = 'Some Nil Points'
276
-
277
- @datasets = [
278
- [:data1, [1, 2, 3, nil, 3, 5, 6]],
279
- [:data2, [5, nil, nil, 5, nil, nil, 5]],
280
- [:data3, [4, nil, 2, 1, 0]],
281
- [:data4, [nil, nil, 3, 1, 2]]
282
- ]
283
-
284
- @datasets.each do |data|
285
- g.data(*data)
286
- end
287
-
288
- # Default theme
289
- g.write('test/output/line_some_nil_points.png')
290
- end
291
-
292
- def test_no_title
293
- g = Gruff::Line.new(400)
294
- g.labels = @labels
295
- @datasets.each do |data|
296
- g.data(data[0], data[1])
297
- end
298
-
299
- g.write('test/output/line_no_title.png')
300
- end
301
-
302
- def test_no_line_markers
303
- g = setup_basic_graph(400)
304
- g.title = 'No Line Markers'
305
- g.hide_line_markers = true
306
- g.write('test/output/line_no_line_markers.png')
307
- end
308
-
309
- def test_no_legend
310
- g = setup_basic_graph(400)
311
- g.title = 'No Legend'
312
- g.hide_legend = true
313
- g.write('test/output/line_no_legend.png')
314
- end
315
-
316
- def test_nothing_but_the_graph
317
- g = setup_basic_graph(400)
318
- g.title = 'THIS TITLE SHOULD NOT DISPLAY!!!'
319
- g.hide_line_markers = true
320
- g.hide_legend = true
321
- g.hide_title = true
322
- g.write('test/output/line_nothing_but_the_graph.png')
323
- end
324
-
325
- def test_legend_below_the_chart
326
- g = setup_basic_graph(400)
327
- g.title = 'Legend below the chart'
328
- g.legend_at_bottom = true
329
- g.write('test/output/line_legend_at_bottom.png')
330
- end
331
-
332
- def test_baseline_larger_than_data
333
- g = setup_basic_graph(400)
334
- g.title = 'Baseline Larger Than Data'
335
- g.baseline_value = 150
336
- g.write('test/output/line_large_baseline.png')
337
- end
338
-
339
- def test_hide_dots
340
- g = setup_basic_graph(400)
341
- g.title = 'Hide Dots'
342
- g.hide_dots = true
343
- g.write('test/output/line_hide_dots.png')
344
- end
345
-
346
- def test_hide_lines
347
- g = setup_basic_graph(400)
348
- g.title = 'Hide Lines'
349
- g.hide_lines = true
350
- g.write('test/output/line_hide_lines.png')
351
- end
352
-
353
- def test_wide_graph
354
- g = setup_basic_graph('800x400')
355
- g.title = 'Wide Graph'
356
- g.write('test/output/line_wide_graph.png')
357
-
358
- g = setup_basic_graph('400x200')
359
- g.title = 'Wide Graph Small'
360
- g.write('test/output/line_wide_graph_small.png')
361
- end
362
-
363
- def test_negative
364
- g = setup_pos_neg(800)
365
- g.write('test/output/line_pos_neg.png')
366
-
367
- g = setup_pos_neg(400)
368
- g.title = 'Pos/Neg Line Test Small'
369
- g.write('test/output/line_pos_neg_400.png')
370
- end
371
-
372
- def test_all_negative
373
- g = setup_all_neg(800)
374
- g.maximum_value = 0
375
- g.write('test/output/line_all_neg.png')
376
- end
377
-
378
- def test_all_negative_no_max_value
379
- g = setup_all_neg(800)
380
- g.write('test/output/line_all_neg_no_max.png')
381
- end
382
-
383
- def test_all_negative_400
384
- g = setup_all_neg(400)
385
- g.maximum_value = 0
386
- g.title = 'All Neg Line Test Small'
387
- g.write('test/output/line_all_neg_400.png')
388
- end
389
-
390
- def test_many_numbers
391
- g = Gruff::Line.new('400x170')
392
- g.title = 'Line Test, Many Numbers'
393
-
394
- data = [
395
- {:date => '01',
396
- :wpm => 0,
397
- :errors => 0,
398
- :accuracy => 0},
399
- {:date => '02',
400
- :wpm => 10,
401
- :errors => 2,
402
- :accuracy => 80},
403
- {:date => '03',
404
- :wpm => 15,
405
- :errors => 0,
406
- :accuracy => 100},
407
- {:date => '04',
408
- :wpm => 16,
409
- :errors => 2,
410
- :accuracy => 87},
411
- {:date => '05'},
412
- {:date => '06',
413
- :wpm => 18,
414
- :errors => 1,
415
- :accuracy => 94},
416
- {:date => '07'},
417
- {:date => '08'},
418
- {:date => '09',
419
- :wpm => 21,
420
- :errors => 1,
421
- :accuracy => 95},
422
- {:date => '10'},
423
- {:date => '11'},
424
- {:date => '12'},
425
- {:date => '13'},
426
- {:date => '14'},
427
- {:date => '15'},
428
- {:date => '16'},
429
- {:date => '17'},
430
- {:date => '18'},
431
- {:date => '19',
432
- :wpm => 28,
433
- :errors => 5,
434
- :accuracy => 82},
435
- {:date => '20'},
436
- {:date => '21'},
437
- {:date => '22'},
438
- {:date => '23'},
439
- {:date => '24'},
440
- {:date => '25'},
441
- {:date => '26'},
442
- {:date => '27',
443
- :wpm => 37,
444
- :errors => 3,
445
- :accuracy => 92},
446
- ]
447
-
448
- [:wpm, :errors, :accuracy].each do |field|
449
- g.dataxy(field, data.each_with_index.map { |d, i| [i + 1, d[field]] if d[field] }.compact)
450
- end
451
-
452
- labels = Hash.new
453
- data.each_with_index do |d, i|
454
- labels[i + 1] = d[:date] if d.size > 1
455
- end
456
- g.labels = labels
457
-
458
- g.write('test/output/line_many_numbers.png')
459
- end
460
-
461
- def test_no_hide_line_no_labels
462
- g = Gruff::Line.new
463
- g.title = 'No Hide Line No Labels'
464
- @datasets.each do |data|
465
- g.data(data[0], data[1])
466
- end
467
- g.hide_line_markers = false
468
- g.write('test/output/line_no_hide.png')
469
- end
470
-
471
- def test_xy_data
472
- g = Gruff::Line.new
473
- g.title = 'X/Y Dataset'
474
- g.dataxy('Apples', [1, 3, 4, 5, 6, 10], [1, 2, 3, 4, 4, 3])
475
- g.dataxy('Bapples', [1, 3, 4, 5, 7, 9], [1, 1, 2, 2, 3, 3])
476
- g.data('Capples', [1, 1, 2, 2, 3, 3])
477
- g.labels = {0 => '2003', 2 => '2004', 4 => '2005', 6 => '2006', 8 => '2007', 10 => '2008'}
478
- g.write('test/output/line_xy.png')
479
- end
480
-
481
- def test_xy_data_pairs
482
- g = Gruff::Line.new
483
- g.title = 'X/Y Dataset Pairs'
484
- g.dataxy('Apples', [[1, 1], [3, 2], [4, 3], [5, 4], [6, 4], [10, 3]])
485
- g.dataxy('Bapples', [[1, 1], [3, 1], [4, 2], [5, 2], [7, 3], [9, 3]])
486
- g.data('Capples', [1, 1, 2, 2, 3, 3])
487
- g.dataxy('Dapples', [[1, 1], [2, 2], [5, 6], [13, 13], [15, nil], [2, 17], [3, nil], [3, 17], [13, nil], [3, 18], [5, nil], [2, 18]])
488
- g.dataxy('Eapples', [[1, 1], [2, 3], [5, 8], [13, 21], [13, 8], [5, 3], [2, 1], [1, 1]])
489
- g.labels = {0 => '2003', 2 => '2004', 4 => '2005', 6 => '2006', 8 => '2007', 10 => '2008', 12 => '2009'}
490
- g.write('test/output/line_xy_pairs.png')
491
- end
492
-
493
- def test_jruby_error
494
- g = Gruff::Line.new
495
- g.theme = {
496
- :colors => %w(#7F0099 #2F85ED #2FED09 #EC962F),
497
- :marker_color => '#aaa',
498
- :background_colors => %w(#E8E8E8 #B9FD6C)
499
- }
500
- g.hide_title = true
501
-
502
- g.legend_font_size = 12
503
- g.marker_font_size = 16
504
- g.hide_dots = false
505
-
506
- g.write('test/output/line_jruby_error.png')
507
- end
508
-
509
- def test_marker_label_accuracy
510
- g = Gruff::Line.new
511
- g.title = 'Marker label accuracy'
512
- g.labels = {
513
- 0 => '1',
514
- 1 => '2',
515
- 2 => '3',
516
- 3 => '4',
517
- 4 => '5'
518
- }
519
- g.data('first', [0.5, 0.51, 0.52, 0.53, 0.54])
520
- g.data('second', [0.6, 0.61, 0.62, 0.63, 0.64])
521
- g.data('third', [0.7, 0.71, 0.72, 0.73, 0.74])
522
-
523
- g.write('test/output/line_marker_label_accuracy.png')
524
- end
525
-
526
- def test_y_axis_increment
527
- g = Gruff::Line.new
528
- g.title = 'y axis increment'
529
-
530
- g.data('data', [1, 2, 3])
531
-
532
- g.y_axis_increment = 1
533
-
534
- g.write('test/output/line_y_axis_increment.png')
535
- end
536
-
537
- def test_multiple_reference_lines
538
-
539
- g = Gruff::Line.new
540
- g.title = 'Line Chart with Multiple Reference Lines'
541
-
542
- g.data('Apples', [3, 2, 3, 4, 4, 3])
543
- g.data('Oranges', [4, 8, 7, 9, 8, 9])
544
- g.data('Watermelon', [2, 3, 4, 5, 6, 8])
545
- g.data('Peaches', [9, 9, 10, 8, 7, 9])
546
-
547
- g.labels = {0 => '2003', 2 => '2004', 4 => '2005'}
548
-
549
- g.reference_line_default_width = 1
550
-
551
- g.reference_lines[:baseline] = { :value => 5 }
552
- g.reference_lines[:lots] = { :value => 9 }
553
- g.reference_lines[:little] = { :value => 3 }
554
- g.reference_lines[:horiz_one] = { :index => 1, :color => 'green' }
555
- g.reference_lines[:horiz_two] = { :index => 3, :color => 'green' }
556
-
557
- g.write('line_reference_lines.png')
558
- end
559
-
560
- def test_baseline
561
- g = Gruff::Line.new
562
- g.title = 'Line Chart with Baseline = 5'
563
-
564
- g.data('Apples', [3, 2, 3, 4, 4, 3])
565
- g.data('Oranges', [4, 8, 7, 9, 8, 9])
566
- g.data('Watermelon', [2, 3, 4, 5, 6, 8])
567
- g.data('Peaches', [9, 9, 10, 8, 7, 9])
568
-
569
- g.labels = {0 => '2003', 2 => '2004', 4 => '2005'}
570
- g.baseline_value = 5
571
-
572
- g.write('line_baseline.png')
573
- end
574
-
575
- def test_webp
576
- g = setup_basic_graph('800x400')
577
- g.title = 'Line Chart WEBP'
578
- g.write('line_webp.webp')
579
- rescue Magick::ImageMagickError
580
- assert_match /no encode delegate for this image format .*\.webp/, $!.message
581
- end
582
-
583
- private
584
-
585
- # TODO Reset data after each theme
586
- def line_graph_with_themes(size=nil)
587
- g = Gruff::Line.new(size)
588
- g.title = "Multi-Line Graph Test #{size}"
589
- g.labels = @labels
590
- g.baseline_value = 90
591
- @datasets.each do |data|
592
- g.data(data[0], data[1])
593
- end
594
- # Default theme
595
- g.write("test/output/line_theme_keynote_#{size}.png")
596
-
597
- g = Gruff::Line.new(size)
598
- g.title = "Multi-Line Graph Test #{size}"
599
- g.labels = @labels
600
- g.baseline_value = 90
601
- g.theme = Gruff::Themes::THIRTYSEVEN_SIGNALS
602
- @datasets.each do |data|
603
- g.data(data[0], data[1])
604
- end
605
- g.write("test/output/line_theme_37signals_#{size}.png")
606
-
607
- g = Gruff::Line.new(size)
608
- g.title = "Multi-Line Graph Test #{size}"
609
- g.labels = @labels
610
- g.baseline_value = 90
611
- g.theme = Gruff::Themes::RAILS_KEYNOTE
612
- @datasets.each do |data|
613
- g.data(data[0], data[1])
614
- end
615
- g.write("test/output/line_theme_rails_keynote_#{size}.png")
616
-
617
- g = Gruff::Line.new(size)
618
- g.title = "Multi-Line Graph Test #{size}"
619
- g.labels = @labels
620
- g.baseline_value = 90
621
- g.theme = Gruff::Themes::ODEO
622
- @datasets.each do |data|
623
- g.data(data[0], data[1])
624
- end
625
- g.write("test/output/line_theme_odeo_#{size}.png")
626
- end
627
-
628
- def setup_pos_neg(size=800)
629
- g = Gruff::Line.new(size)
630
- g.title = 'Pos/Neg Line Graph Test'
631
- g.labels = {
632
- 0 => '5/6',
633
- 1 => '5/15',
634
- 2 => '5/24',
635
- 3 => '5/30',
636
- }
637
- g.data(:apples, [-1, 0, 4, -4])
638
- g.data(:peaches, [10, 8, 6, 3])
639
- g
640
- end
641
-
642
-
643
- def setup_all_neg(size=800)
644
- g = Gruff::Line.new(size)
645
- g.title = 'All Neg Line Graph Test'
646
- g.labels = {
647
- 0 => '5/6',
648
- 1 => '5/15',
649
- 2 => '5/24',
650
- 3 => '5/30',
651
- }
652
- g.data(:apples, [-1, -5, -20, -4])
653
- g.data(:peaches, [-10, -8, -6, -3])
654
- g
655
- end
656
-
657
- end