gruff 0.6.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) 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 +112 -0
  7. data/.travis.yml +24 -15
  8. data/.yardopts +1 -0
  9. data/{History.txt → CHANGELOG.md} +72 -25
  10. data/Gemfile +3 -7
  11. data/README.md +57 -25
  12. data/Rakefile +21 -192
  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 +21 -13
  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 +435 -704
  26. data/lib/gruff/bezier.rb +32 -17
  27. data/lib/gruff/bullet.rb +62 -68
  28. data/lib/gruff/dot.rb +38 -82
  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 +60 -0
  33. data/lib/gruff/line.rb +134 -170
  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 +68 -81
  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 +39 -42
  42. data/lib/gruff/pie.rb +180 -89
  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 +42 -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 +132 -0
  53. data/lib/gruff/renderer/text.rb +53 -0
  54. data/lib/gruff/scatter.rb +163 -182
  55. data/lib/gruff/scene.rb +31 -41
  56. data/lib/gruff/side_bar.rb +81 -65
  57. data/lib/gruff/side_stacked_bar.rb +78 -62
  58. data/lib/gruff/spider.rb +49 -57
  59. data/lib/gruff/stacked_area.rb +40 -32
  60. data/lib/gruff/stacked_bar.rb +86 -53
  61. data/lib/gruff/store/base_data.rb +38 -0
  62. data/lib/gruff/store/custom_data.rb +38 -0
  63. data/lib/gruff/store/store.rb +80 -0
  64. data/lib/gruff/store/xy_data.rb +59 -0
  65. data/lib/gruff/themes.rb +32 -33
  66. data/lib/gruff/version.rb +3 -1
  67. metadata +80 -89
  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_labels_for_null_data.rb +0 -27
  107. data/test/test_legend.rb +0 -68
  108. data/test/test_line.rb +0 -657
  109. data/test/test_mini_bar.rb +0 -33
  110. data/test/test_mini_pie.rb +0 -25
  111. data/test/test_mini_side_bar.rb +0 -36
  112. data/test/test_net.rb +0 -231
  113. data/test/test_photo.rb +0 -41
  114. data/test/test_pie.rb +0 -161
  115. data/test/test_scatter.rb +0 -233
  116. data/test/test_scene.rb +0 -100
  117. data/test/test_side_bar.rb +0 -56
  118. data/test/test_sidestacked_bar.rb +0 -105
  119. data/test/test_spider.rb +0 -226
  120. data/test/test_stacked_area.rb +0 -52
  121. data/test/test_stacked_bar.rb +0 -68
@@ -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,27 +0,0 @@
1
- require File.dirname(__FILE__) + "/gruff_test_case"
2
-
3
- class TestLabelsForNullData < GruffTestCase
4
-
5
- def setup
6
- @dataset = [nil, 1, 2, 1, nil]
7
-
8
- @labels = {
9
- 0 => '1',
10
- 1 => '2',
11
- 2 => '3',
12
- 3 => '4',
13
- 4 => '5'
14
- }
15
- end
16
-
17
- def test_labels
18
- g = Gruff::Line.new
19
- g.title = 'Labels For Null Data'
20
- g.labels = @labels
21
- g.data('data', @dataset)
22
- g.minimum_value = 0
23
-
24
- g.write("test/output/TestLabelsForNullData.png")
25
- end
26
-
27
- end
@@ -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