thinreports 0.9.1 → 0.11.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 (213) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/test.yml +39 -0
  3. data/.gitignore +1 -0
  4. data/CHANGELOG.md +59 -2
  5. data/Dockerfile +12 -0
  6. data/Gemfile +7 -4
  7. data/README.md +44 -22
  8. data/Rakefile +14 -31
  9. data/lib/thinreports.rb +16 -15
  10. data/lib/thinreports/config.rb +2 -24
  11. data/lib/thinreports/core/errors.rb +6 -17
  12. data/lib/thinreports/core/format/base.rb +62 -61
  13. data/lib/thinreports/core/shape.rb +10 -12
  14. data/lib/thinreports/core/shape/base.rb +3 -12
  15. data/lib/thinreports/core/shape/base/interface.rb +34 -32
  16. data/lib/thinreports/core/shape/base/internal.rb +45 -43
  17. data/lib/thinreports/core/shape/basic.rb +12 -12
  18. data/lib/thinreports/core/shape/basic/block_format.rb +8 -6
  19. data/lib/thinreports/core/shape/basic/block_interface.rb +24 -22
  20. data/lib/thinreports/core/shape/basic/block_internal.rb +28 -26
  21. data/lib/thinreports/core/shape/basic/format.rb +11 -9
  22. data/lib/thinreports/core/shape/basic/interface.rb +79 -77
  23. data/lib/thinreports/core/shape/basic/internal.rb +17 -14
  24. data/lib/thinreports/core/shape/image_block.rb +9 -9
  25. data/lib/thinreports/core/shape/image_block/format.rb +7 -5
  26. data/lib/thinreports/core/shape/image_block/interface.rb +15 -13
  27. data/lib/thinreports/core/shape/image_block/internal.rb +10 -8
  28. data/lib/thinreports/core/shape/list.rb +13 -13
  29. data/lib/thinreports/core/shape/list/format.rb +83 -77
  30. data/lib/thinreports/core/shape/list/manager.rb +179 -176
  31. data/lib/thinreports/core/shape/list/page.rb +91 -93
  32. data/lib/thinreports/core/shape/list/page_state.rb +42 -40
  33. data/lib/thinreports/core/shape/list/section_format.rb +28 -26
  34. data/lib/thinreports/core/shape/list/section_interface.rb +42 -40
  35. data/lib/thinreports/core/shape/list/section_internal.rb +21 -19
  36. data/lib/thinreports/core/shape/manager.rb +4 -13
  37. data/lib/thinreports/core/shape/manager/format.rb +21 -19
  38. data/lib/thinreports/core/shape/manager/internal.rb +87 -84
  39. data/lib/thinreports/core/shape/manager/target.rb +93 -95
  40. data/lib/thinreports/core/shape/page_number.rb +9 -9
  41. data/lib/thinreports/core/shape/page_number/format.rb +20 -18
  42. data/lib/thinreports/core/shape/page_number/interface.rb +20 -18
  43. data/lib/thinreports/core/shape/page_number/internal.rb +46 -44
  44. data/lib/thinreports/core/shape/style.rb +5 -14
  45. data/lib/thinreports/core/shape/style/base.rb +121 -120
  46. data/lib/thinreports/core/shape/style/basic.rb +12 -10
  47. data/lib/thinreports/core/shape/style/graphic.rb +35 -33
  48. data/lib/thinreports/core/shape/style/text.rb +113 -107
  49. data/lib/thinreports/core/shape/text.rb +9 -9
  50. data/lib/thinreports/core/shape/text/format.rb +10 -9
  51. data/lib/thinreports/core/shape/text/interface.rb +13 -11
  52. data/lib/thinreports/core/shape/text/internal.rb +14 -12
  53. data/lib/thinreports/core/shape/text_block.rb +10 -10
  54. data/lib/thinreports/core/shape/text_block/format.rb +35 -33
  55. data/lib/thinreports/core/shape/text_block/formatter.rb +26 -24
  56. data/lib/thinreports/core/shape/text_block/formatter/basic.rb +25 -25
  57. data/lib/thinreports/core/shape/text_block/formatter/datetime.rb +15 -12
  58. data/lib/thinreports/core/shape/text_block/formatter/number.rb +52 -34
  59. data/lib/thinreports/core/shape/text_block/formatter/padding.rb +17 -14
  60. data/lib/thinreports/core/shape/text_block/interface.rb +25 -23
  61. data/lib/thinreports/core/shape/text_block/internal.rb +66 -68
  62. data/lib/thinreports/core/utils.rb +7 -3
  63. data/lib/thinreports/generator/pdf.rb +24 -25
  64. data/lib/thinreports/generator/pdf/document.rb +109 -110
  65. data/lib/thinreports/generator/pdf/document/draw_shape.rb +57 -51
  66. data/lib/thinreports/generator/pdf/document/draw_template_items.rb +50 -47
  67. data/lib/thinreports/generator/pdf/document/font.rb +67 -58
  68. data/lib/thinreports/generator/pdf/document/graphics.rb +32 -33
  69. data/lib/thinreports/generator/pdf/document/graphics/attributes.rb +121 -121
  70. data/lib/thinreports/generator/pdf/document/graphics/basic.rb +112 -114
  71. data/lib/thinreports/generator/pdf/document/graphics/image.rb +58 -150
  72. data/lib/thinreports/generator/pdf/document/graphics/text.rb +149 -137
  73. data/lib/thinreports/generator/pdf/document/page.rb +60 -64
  74. data/lib/thinreports/generator/pdf/document/parse_color.rb +37 -37
  75. data/lib/thinreports/generator/pdf/drawer/base.rb +41 -41
  76. data/lib/thinreports/generator/pdf/drawer/list.rb +56 -54
  77. data/lib/thinreports/generator/pdf/drawer/list_section.rb +42 -40
  78. data/lib/thinreports/generator/pdf/drawer/page.rb +101 -96
  79. data/lib/thinreports/generator/pdf/prawn_ext.rb +4 -30
  80. data/lib/thinreports/generator/pdf/prawn_ext/calc_image_dimensions.rb +32 -0
  81. data/lib/thinreports/generator/pdf/prawn_ext/width_of.rb +35 -0
  82. data/lib/thinreports/layout.rb +5 -7
  83. data/lib/thinreports/layout/base.rb +5 -9
  84. data/lib/thinreports/layout/format.rb +17 -13
  85. data/lib/thinreports/layout/legacy_schema.rb +17 -13
  86. data/lib/thinreports/layout/version.rb +22 -25
  87. data/lib/thinreports/report.rb +4 -6
  88. data/lib/thinreports/report/base.rb +24 -51
  89. data/lib/thinreports/report/internal.rb +13 -15
  90. data/lib/thinreports/report/page.rb +5 -11
  91. data/lib/thinreports/version.rb +2 -2
  92. data/thinreports.gemspec +10 -19
  93. metadata +13 -288
  94. data/.travis.yml +0 -19
  95. data/examples/character_spacing/character_spacing.rb +0 -8
  96. data/examples/character_spacing/character_spacing.tlf +0 -293
  97. data/examples/dynamic_image/dynamic_image.rb +0 -31
  98. data/examples/dynamic_image/dynamic_image.tlf +0 -661
  99. data/examples/dynamic_image/img200x100.png +0 -0
  100. data/examples/dynamic_image/img50x50.png +0 -0
  101. data/examples/dynamic_style/dynamic_style.rb +0 -150
  102. data/examples/dynamic_style/dynamic_style.tlf +0 -1835
  103. data/examples/dynamic_style/dynamic_style_in_list.tlf +0 -344
  104. data/examples/dynamic_style/image.png +0 -0
  105. data/examples/eudc/eudc.rb +0 -20
  106. data/examples/eudc/eudc.tlf +0 -180
  107. data/examples/eudc/eudc.ttf +0 -0
  108. data/examples/helper.rb +0 -50
  109. data/examples/hidden_shapes/hidden_shapes.rb +0 -9
  110. data/examples/hidden_shapes/hidden_shapes.tlf +0 -449
  111. data/examples/list_events/list_events.rb +0 -32
  112. data/examples/list_events/list_events.tlf +0 -361
  113. data/examples/list_manual_generation/list_manual_generation.rb +0 -22
  114. data/examples/list_manual_generation/list_manual_generation.tlf +0 -132
  115. data/examples/list_page_number/list_page_number.rb +0 -17
  116. data/examples/list_page_number/list_page_number.tlf +0 -254
  117. data/examples/page_number/page_number.rb +0 -33
  118. data/examples/page_number/page_number.tlf +0 -215
  119. data/examples/palleted_png/palleted_png.png +0 -0
  120. data/examples/palleted_png/palleted_png.rb +0 -11
  121. data/examples/palleted_png/palleted_png.tlf +0 -47
  122. data/examples/password_setting/password_setting.rb +0 -10
  123. data/examples/password_setting/password_setting.tlf +0 -45
  124. data/examples/report_callbacks/report_callbacks.rb +0 -14
  125. data/examples/report_callbacks/report_callbacks.tlf +0 -147
  126. data/examples/single_line_tblock/single_line_tblock.rb +0 -13
  127. data/examples/single_line_tblock/single_line_tblock.tlf +0 -170
  128. data/examples/tblock_overflow/tblock_overflow.rb +0 -20
  129. data/examples/tblock_overflow/tblock_overflow.tlf +0 -538
  130. data/examples/tblock_styles/font_size.tlf +0 -383
  131. data/examples/tblock_styles/tblock_styles.rb +0 -43
  132. data/examples/tblock_styles/tblock_styles.tlf +0 -889
  133. data/examples/text_align/text_align.rb +0 -8
  134. data/examples/text_align/text_align.tlf +0 -241
  135. data/examples/typeB_page_size/B4_ISO.tlf +0 -45
  136. data/examples/typeB_page_size/B4_JIS.tlf +0 -45
  137. data/examples/typeB_page_size/typeB_page_size.rb +0 -17
  138. data/examples/word_wrap/word_wrap.rb +0 -26
  139. data/examples/word_wrap/word_wrap.tlf +0 -297
  140. data/lib/thinreports/generator.rb +0 -29
  141. data/lib/thinreports/generator/base.rb +0 -40
  142. data/lib/thinreports/generator/configuration.rb +0 -31
  143. data/lib/thinreports/report/events.rb +0 -32
  144. data/test/data/font.ttf +0 -0
  145. data/test/data/image_normal.jpg +0 -0
  146. data/test/data/image_normal.png +0 -0
  147. data/test/data/image_normal_jpg_noext +0 -0
  148. data/test/data/image_normal_png_noext +0 -0
  149. data/test/data/image_pallete_based.png +0 -0
  150. data/test/data/legacy_layout/all-items.tlf +0 -1
  151. data/test/schema_helper.rb +0 -121
  152. data/test/test_helper.rb +0 -42
  153. data/test/tmp/.gitkeep +0 -0
  154. data/test/unit/core/format/test_base.rb +0 -152
  155. data/test/unit/core/shape/base/test_internal.rb +0 -87
  156. data/test/unit/core/shape/basic/test_block_format.rb +0 -23
  157. data/test/unit/core/shape/basic/test_block_interface.rb +0 -29
  158. data/test/unit/core/shape/basic/test_block_internal.rb +0 -55
  159. data/test/unit/core/shape/basic/test_format.rb +0 -37
  160. data/test/unit/core/shape/basic/test_interface.rb +0 -108
  161. data/test/unit/core/shape/basic/test_internal.rb +0 -55
  162. data/test/unit/core/shape/image_block/test_interface.rb +0 -24
  163. data/test/unit/core/shape/image_block/test_internal.rb +0 -31
  164. data/test/unit/core/shape/list/test_format.rb +0 -111
  165. data/test/unit/core/shape/list/test_manager.rb +0 -67
  166. data/test/unit/core/shape/list/test_page.rb +0 -82
  167. data/test/unit/core/shape/list/test_page_state.rb +0 -31
  168. data/test/unit/core/shape/list/test_section_format.rb +0 -36
  169. data/test/unit/core/shape/list/test_section_interface.rb +0 -75
  170. data/test/unit/core/shape/list/test_section_internal.rb +0 -50
  171. data/test/unit/core/shape/manager/test_format.rb +0 -38
  172. data/test/unit/core/shape/manager/test_internal.rb +0 -132
  173. data/test/unit/core/shape/manager/test_target.rb +0 -140
  174. data/test/unit/core/shape/page_number/test_format.rb +0 -55
  175. data/test/unit/core/shape/page_number/test_interface.rb +0 -33
  176. data/test/unit/core/shape/page_number/test_internal.rb +0 -81
  177. data/test/unit/core/shape/styles/test_base.rb +0 -191
  178. data/test/unit/core/shape/styles/test_basic.rb +0 -24
  179. data/test/unit/core/shape/styles/test_graphic.rb +0 -50
  180. data/test/unit/core/shape/styles/test_text.rb +0 -97
  181. data/test/unit/core/shape/text/test_format.rb +0 -44
  182. data/test/unit/core/shape/text/test_internal.rb +0 -20
  183. data/test/unit/core/shape/text_block/formatter/test_basic.rb +0 -24
  184. data/test/unit/core/shape/text_block/formatter/test_datetime.rb +0 -49
  185. data/test/unit/core/shape/text_block/formatter/test_number.rb +0 -76
  186. data/test/unit/core/shape/text_block/formatter/test_padding.rb +0 -77
  187. data/test/unit/core/shape/text_block/test_format.rb +0 -169
  188. data/test/unit/core/shape/text_block/test_formatter.rb +0 -28
  189. data/test/unit/core/shape/text_block/test_interface.rb +0 -63
  190. data/test/unit/core/shape/text_block/test_internal.rb +0 -128
  191. data/test/unit/core/test_shape.rb +0 -52
  192. data/test/unit/core/test_utils.rb +0 -68
  193. data/test/unit/generator/pdf/document/graphics/test_attributes.rb +0 -135
  194. data/test/unit/generator/pdf/document/graphics/test_basic.rb +0 -45
  195. data/test/unit/generator/pdf/document/graphics/test_image.rb +0 -150
  196. data/test/unit/generator/pdf/document/graphics/test_text.rb +0 -171
  197. data/test/unit/generator/pdf/document/test_font.rb +0 -84
  198. data/test/unit/generator/pdf/document/test_graphics.rb +0 -42
  199. data/test/unit/generator/pdf/document/test_page.rb +0 -122
  200. data/test/unit/generator/pdf/document/test_parse_color.rb +0 -30
  201. data/test/unit/generator/pdf/test_document.rb +0 -20
  202. data/test/unit/generator/test_base.rb +0 -40
  203. data/test/unit/generator/test_configuration.rb +0 -21
  204. data/test/unit/generator/test_pdf.rb +0 -24
  205. data/test/unit/layout/test_base.rb +0 -41
  206. data/test/unit/layout/test_format.rb +0 -100
  207. data/test/unit/layout/test_legacy_schema.rb +0 -574
  208. data/test/unit/layout/test_version.rb +0 -95
  209. data/test/unit/report/test_base.rb +0 -262
  210. data/test/unit/report/test_internal.rb +0 -206
  211. data/test/unit/test_config.rb +0 -51
  212. data/test/unit/test_layout.rb +0 -12
  213. data/test/unit/test_report.rb +0 -18
@@ -1,128 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'test_helper'
4
-
5
- class Thinreports::Core::Shape::TextBlock::TestInternal < Minitest::Test
6
- include Thinreports::TestHelper
7
-
8
- # Alias
9
- TextBlock = Thinreports::Core::Shape::TextBlock
10
-
11
- def create_parent
12
- report = Thinreports::Report.new layout: layout_file.path
13
- report.start_new_page do |page|
14
- # Add to force TextBlock shape.
15
- page.manager.format.shapes[:foo] = TextBlock::Format.new('type' => 'text-block',
16
- 'id' => 'foo')
17
- # Set value to TextBlock.
18
- page.item(:foo).value('foo value')
19
- end
20
- end
21
-
22
- def create_internal(format_config = {})
23
- TextBlock::Internal.new(create_parent, TextBlock::Format.new(format_config))
24
- end
25
-
26
- def test_multiple_asker_should_operate_as_delegator_of_format
27
- tblock = create_internal('multiple-line' => true)
28
- assert_equal tblock.multiple?, tblock.format.multiple?
29
- end
30
-
31
- def test_style_should_return_the_instance_of_Style_Text
32
- assert_instance_of Thinreports::Core::Shape::Style::Text, create_internal.style
33
- end
34
-
35
- def test_read_value_should_return_the_format_value_as_default
36
- tblock = create_internal('value' => 'default value')
37
- assert_equal tblock.read_value, 'default value'
38
- end
39
-
40
- def test_read_value_should_return_the_value_of_referenced_shape
41
- tblock = create_internal('reference-id' => 'foo', 'value' => '')
42
- assert_equal tblock.read_value, 'foo value'
43
- end
44
-
45
- def test_read_value_should_return_the_value_stored_in_states
46
- tblock = create_internal
47
- tblock.states[:value] = 'value in states'
48
-
49
- assert_equal tblock.read_value, 'value in states'
50
- end
51
-
52
- def test_write_value_should_properly_set_the_specified_value_to_states
53
- tblock = create_internal
54
- tblock.write_value(1000)
55
-
56
- assert_equal tblock.states[:value], 1000
57
- end
58
-
59
- def test_write_value_should_show_warnings_when_tblock_has_reference
60
- tblock = create_internal('id' => 'bar', 'reference-id' => 'foo')
61
- _out, err = capture_io do
62
- tblock.write_value('value')
63
- end
64
- assert_equal err.chomp, 'The set value was not saved, ' +
65
- "Because 'bar' has reference to 'foo'."
66
- end
67
-
68
- def test_real_value_should_return_the_formatted_value_when_tblock_has_any_format
69
- tblock = create_internal('format' => {'type' => 'datetime',
70
- 'datetime' => {'format' => '%Y/%m/%d'}})
71
- tblock.write_value(value = Time.now)
72
-
73
- assert_equal tblock.real_value, value.strftime('%Y/%m/%d')
74
- end
75
-
76
- def test_real_value_should_return_the_raw_value_when_tblock_has_no_format
77
- tblock = create_internal
78
- tblock.write_value('any value')
79
-
80
- assert_equal tblock.real_value, 'any value'
81
- end
82
-
83
- def test_format_enabled_should_properly_set_value_to_states_as_format_enabled
84
- tblock = create_internal
85
- tblock.format_enabled(false)
86
-
87
- assert_equal tblock.states[:format_enabled], false
88
- end
89
-
90
- def test_format_enabled_asker_should_return_true_when_format_has_any_type
91
- tblock = create_internal('format' => {'type' => 'datetime'})
92
-
93
- assert_equal tblock.format_enabled?, true
94
- end
95
-
96
- def test_format_enabled_asker_should_return_true_when_base_of_format_has_any_value
97
- tblock = create_internal('format' => {'base' => '{value}'})
98
-
99
- assert_equal tblock.format_enabled?, true
100
- end
101
-
102
- def test_format_enabled_asker_should_return_false_when_format_has_no_type_and_base_has_not_value
103
- assert_equal create_internal.format_enabled?, false
104
- end
105
-
106
- def test_format_enabled_asker_should_return_false_constantly_when_tblock_is_multiple_mode
107
- tblock = create_internal('multiple-line' => true,
108
- 'format' => {'base' => '{value}',
109
- 'type' => 'number'})
110
- tblock.format_enabled(true)
111
-
112
- assert_equal tblock.format_enabled?, false
113
- end
114
-
115
- def test_type_of_asker_should_return_true_when_value_is_tblock
116
- assert_equal create_internal.type_of?('text-block'), true
117
- end
118
-
119
- def test_type_of_asker_should_return_true_when_value_is_block
120
- assert_equal create_internal.type_of?(:block), true
121
- end
122
-
123
- def test_formatter_should_return_instance_of_FormatterBasic_when_format_is_enable
124
- tblock = create_internal('format' => {'type' => 'datetime'})
125
-
126
- assert_kind_of TextBlock::Formatter::Basic, tblock.send(:formatter)
127
- end
128
- end
@@ -1,52 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'test_helper'
4
-
5
- class Thinreports::Core::TestShape < Minitest::Test
6
- include Thinreports::TestHelper
7
-
8
- # Alias
9
- ShapeModule = Thinreports::Core::Shape
10
-
11
- def test_find_by_type_should_return_PageNumber
12
- assert_same ShapeModule.find_by_type('page-number'), ShapeModule::PageNumber
13
- end
14
-
15
- def test_find_by_type_should_return_ImageBlock
16
- assert_same ShapeModule.find_by_type('image-block'), ShapeModule::ImageBlock
17
- end
18
-
19
- def test_find_by_type_should_return_TextBlock
20
- assert_same ShapeModule.find_by_type('text-block'), ShapeModule::TextBlock
21
- end
22
-
23
- def test_find_by_type_should_return_List
24
- assert_same ShapeModule.find_by_type('list'), ShapeModule::List
25
- end
26
-
27
- def test_find_by_type_should_return_Text
28
- assert_same ShapeModule.find_by_type('text'), ShapeModule::Text
29
- end
30
-
31
- def test_find_by_type_should_return_Basic_as_Image
32
- assert_same ShapeModule.find_by_type('image'), ShapeModule::Basic
33
- end
34
-
35
- def test_find_by_type_should_return_Basic_as_Line
36
- assert_same ShapeModule.find_by_type('line'), ShapeModule::Basic
37
- end
38
-
39
- def test_find_by_type_should_return_Basic_as_Rect
40
- assert_same ShapeModule.find_by_type('rect'), ShapeModule::Basic
41
- end
42
-
43
- def test_find_by_type_should_return_Basic_as_Ellipse
44
- assert_same ShapeModule.find_by_type('ellipse'), ShapeModule::Basic
45
- end
46
-
47
- def test_find_by_type_should_raise
48
- assert_raises Thinreports::Errors::UnknownShapeType do
49
- ShapeModule.find_by_type('unknown')
50
- end
51
- end
52
- end
@@ -1,68 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'test_helper'
4
-
5
- class Thinreports::Core::TestShape < Minitest::Test
6
- include Thinreports::TestHelper
7
- include Thinreports::Utils
8
-
9
- def test_call_block_in
10
- expected = '123'
11
- assert_same expected, call_block_in(expected)
12
-
13
- assert_equal '321', call_block_in('123', &proc { reverse! })
14
- assert_equal [1, 2, 3], call_block_in([2, 1, 3], &proc { |a| a.sort! })
15
- end
16
-
17
- def test_deep_copy_in_unsupported_object
18
- [123, nil, Struct.new(:foo).new].each do |unsupported_value|
19
- assert_raises ArgumentError do
20
- deep_copy(unsupported_value)
21
- end
22
- end
23
- end
24
-
25
- def test_deep_copy_in_Array
26
- src = ['string', Time.now]
27
- dup = deep_copy(src)
28
-
29
- refute_same dup, src
30
-
31
- src.each_with_index do |e, i|
32
- assert_equal dup[i], e
33
- refute_same dup[i], e
34
- end
35
- end
36
-
37
- def test_deep_copy_in_Hash
38
- src = { a: 'string', b: Time.now }
39
- dup = deep_copy(src)
40
-
41
- refute_same dup, src
42
-
43
- src.each do |k, v|
44
- assert_equal dup[k], v
45
- refute_same dup[k], v
46
- end
47
- end
48
-
49
- def test_blank_value_in_String
50
- ["", ''].each do |val|
51
- assert_equal true, blank_value?(val)
52
- end
53
-
54
- [' ', ' ', 'abc', 'あいう'].each do |val|
55
- assert_equal false, blank_value?(val)
56
- end
57
- end
58
-
59
- def test_blank_value_in_NilClass
60
- assert_equal true, blank_value?(nil)
61
- end
62
-
63
- def test_blank_value_in_other_classes
64
- [0, 1, -1, 9.99, true, false, Time.now].each do |val|
65
- assert_equal false, blank_value?(val)
66
- end
67
- end
68
- end
@@ -1,135 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'test_helper'
4
-
5
- class Thinreports::Generator::PDF::Graphics::TestAttributes < Minitest::Test
6
- include Thinreports::TestHelper
7
-
8
- def setup
9
- @pdf = Thinreports::Generator::PDF::Document.new
10
- end
11
-
12
- def test_build_graphic_attributes
13
- graphic_styles = {
14
- 'border-color' => '#ff0000',
15
- 'border-width' => 2.0,
16
- 'border-style' => 'solid',
17
- 'fill-color' => '#000000'
18
- }
19
-
20
- assert_equal(
21
- {
22
- stroke: '#ff0000',
23
- stroke_width: 2.0,
24
- stroke_type: 'solid',
25
- fill: '#000000'
26
- },
27
- @pdf.build_graphic_attributes(graphic_styles)
28
- )
29
-
30
- customized_attributes = @pdf.build_graphic_attributes(graphic_styles) { |attrs| attrs[:stroke] = 'blue' }
31
- assert_equal 'blue', customized_attributes[:stroke]
32
- end
33
-
34
- def test_build_text_attributes
35
- text_styles = {
36
- 'font-family' => %w( Helvetica IPAMincho ),
37
- 'font-size' => 18.0,
38
- 'color' => 'red',
39
- 'text-align' => 'right',
40
- 'vertical-align' => 'bottom',
41
- 'font-style' => %w( bold italic ),
42
- 'letter-spacing' => 2.0,
43
- 'line-height' => 20.0,
44
- 'overflow' => 'expand',
45
- 'word-wrap' => 'break-word'
46
- }
47
-
48
- assert_equal(
49
- {
50
- font: 'Helvetica',
51
- size: 18.0,
52
- color: 'red',
53
- align: :right,
54
- valign: :bottom,
55
- styles: [:bold, :italic],
56
- letter_spacing: 2.0,
57
- line_height: 20.0,
58
- overflow: :expand,
59
- word_wrap: :break_word
60
- },
61
- @pdf.build_text_attributes(text_styles)
62
- )
63
-
64
- customized_attributes = @pdf.build_text_attributes(text_styles) { |attrs| attrs[:color] = 'blue' }
65
- assert_equal 'blue', customized_attributes[:color]
66
- end
67
-
68
- def test_font_family
69
- assert_equal 'IPAGothic', @pdf.font_family(%w( IPAGothic Helvetica ))
70
- assert_equal 'Helvetica', @pdf.font_family(%w( Unknown IPAMincho ))
71
- end
72
-
73
- def test_font_styles
74
- assert_equal [:bold, :italic, :underline, :strikethrough],
75
- @pdf.font_styles(%w( bold italic underline linethrough ))
76
- end
77
-
78
- def test_letter_spacing
79
- assert_equal 2.0, @pdf.letter_spacing(2.0)
80
- assert_nil @pdf.letter_spacing('')
81
- assert_nil @pdf.letter_spacing(nil)
82
- end
83
-
84
- def test_text_align
85
- assert_equal :left, @pdf.text_align('left')
86
- assert_equal :center, @pdf.text_align('center')
87
- assert_equal :right, @pdf.text_align('right')
88
- assert_equal :left, @pdf.text_align('')
89
- assert_equal :left, @pdf.text_align(nil)
90
- end
91
-
92
- def test_text_valign
93
- assert_equal :top, @pdf.text_valign('top')
94
- assert_equal :center, @pdf.text_valign('middle')
95
- assert_equal :bottom, @pdf.text_valign('bottom')
96
- assert_equal :top, @pdf.text_valign('')
97
- assert_equal :top, @pdf.text_valign(nil)
98
- end
99
-
100
- def test_text_overflow
101
- assert_equal :truncate, @pdf.text_overflow('truncate')
102
- assert_equal :shrink_to_fit, @pdf.text_overflow('fit')
103
- assert_equal :expand, @pdf.text_overflow('expand')
104
- assert_equal :truncate, @pdf.text_overflow('')
105
- assert_equal :truncate, @pdf.text_overflow(nil)
106
- end
107
-
108
- def test_word_wrap
109
- assert_equal :break_word, @pdf.word_wrap('break-word')
110
- assert_equal :none, @pdf.word_wrap('none')
111
- assert_equal :none, @pdf.word_wrap(nil)
112
- end
113
-
114
- def test_line_height
115
- assert_equal 20.9, @pdf.line_height(20.9)
116
- assert_nil @pdf.line_height('')
117
- assert_nil @pdf.line_height(nil)
118
- end
119
-
120
- def test_image_position_x
121
- assert_equal :left, @pdf.image_position_x('left')
122
- assert_equal :center, @pdf.image_position_x('center')
123
- assert_equal :right, @pdf.image_position_x('right')
124
- assert_equal :left, @pdf.image_position_x('')
125
- assert_equal :left, @pdf.image_position_x(nil)
126
- end
127
-
128
- def test_image_position_y
129
- assert_equal :top, @pdf.image_position_y('top')
130
- assert_equal :center, @pdf.image_position_y('middle')
131
- assert_equal :bottom, @pdf.image_position_y('bottom')
132
- assert_equal :top, @pdf.image_position_y('')
133
- assert_equal :top, @pdf.image_position_y(nil)
134
- end
135
- end
@@ -1,45 +0,0 @@
1
- # coding: utf-8
2
- require 'test_helper'
3
-
4
- class Thinreports::Generator::PDF::Graphics::TestBasic < Minitest::Test
5
- include Thinreports::TestHelper
6
-
7
- def setup
8
- @pdf = Thinreports::Generator::PDF::Document.new
9
- end
10
-
11
- def test_build_stroke_styles
12
- style = {
13
- stroke: 'red',
14
- stroke_width: 2.0,
15
- stroke_type: 'solid'
16
- }
17
-
18
- assert_equal(
19
- {
20
- color: 'ff0000',
21
- width: 2.0,
22
- dash: nil
23
- },
24
- @pdf.build_stroke_styles(style)
25
- )
26
-
27
- style_stroke_dashed = style.merge(stroke_type: 'dashed')
28
- assert_equal [2, 2], @pdf.build_stroke_styles(style_stroke_dashed)[:dash]
29
-
30
- style_stroke_dotted = style.merge(stroke_type: 'dotted')
31
- assert_equal [1, 2], @pdf.build_stroke_styles(style_stroke_dotted)[:dash]
32
-
33
- assert_nil @pdf.build_stroke_styles(stroke: nil, stroke_width: 1)
34
- assert_nil @pdf.build_stroke_styles(stroke: 'none', stroke_width: 1)
35
-
36
- assert_nil @pdf.build_stroke_styles(stroke_width: nil, stroke: 'red')
37
- assert_nil @pdf.build_stroke_styles(stroke_width: 0, stroke: 'red')
38
- end
39
-
40
- def test_build_fill_styles
41
- assert_equal({ color: 'ff0000' }, @pdf.build_fill_styles(fill: 'red'))
42
- assert_nil @pdf.build_fill_styles(fill: nil)
43
- assert_nil @pdf.build_fill_styles(fill: 'none')
44
- end
45
- end
@@ -1,150 +0,0 @@
1
- # coding: utf-8
2
-
3
- require 'test_helper'
4
-
5
- require 'base64'
6
- require 'digest/md5'
7
-
8
- class Thinreports::Generator::PDF::Graphics::TestImage < Minitest::Test
9
- include Thinreports::TestHelper
10
-
11
- class TestImage
12
- include Thinreports::Generator::PDF::Graphics
13
- end
14
-
15
- def test_normalize_image_from_base64_in_disabled
16
- Thinreports.config.convert_palleted_transparency_png = false
17
-
18
- test_image = TestImage.new
19
- base64_image = Base64.encode64(read_data_file('image_normal.png'))
20
-
21
- # Should not be normalized
22
- TestImage::PNGNormalizer.stubs(:load_blob).never
23
- test_image.normalize_image_from_base64('image/png', base64_image)
24
-
25
- image_registry = test_image.temp_image_registry
26
- assert_equal 1, image_registry.count
27
- end
28
-
29
- def test_normalize_image_from_file_in_disabled
30
- Thinreports.config.convert_palleted_transparency_png = false
31
-
32
- original_image_path = data_file('image_pallete_based.png')
33
-
34
- test_image = TestImage.new
35
- returned_image_path = test_image.normalize_image_from_file(original_image_path)
36
-
37
- # Should not be normalized
38
- assert_empty test_image.temp_image_registry
39
- assert_same original_image_path, returned_image_path
40
- end
41
-
42
- def test_normalize_image_from_base64_with_normal_images
43
- Thinreports.config.convert_palleted_transparency_png = true
44
-
45
- [
46
- ['image/png', 'image_normal.png'],
47
- ['image/jpeg', 'image_normal.jpg']
48
- ]
49
- .each do |(image_type, image_file)|
50
- base64_normal_image = Base64.encode64(read_data_file(image_file))
51
-
52
- test_image = TestImage.new
53
-
54
- normalized_image_path = test_image.normalize_image_from_base64(image_type, base64_normal_image)
55
-
56
- image_registry = test_image.temp_image_registry
57
- assert_equal 1, image_registry.count
58
-
59
- image_id = Digest::MD5.hexdigest(base64_normal_image)
60
- assert_includes image_registry.keys, image_id
61
- assert_equal normalized_image_path, image_registry[image_id].path
62
-
63
- assert equal_image(data_file(image_file), normalized_image_path)
64
-
65
- assert_equal normalized_image_path,
66
- test_image.normalize_image_from_base64(image_type, base64_normal_image)
67
- end
68
- end
69
-
70
- def test_normalize_image_from_base64_with_palette_transparency_png
71
- Thinreports.config.convert_palleted_transparency_png = true
72
-
73
- base64_palleted_png = Base64.encode64(read_data_file('image_pallete_based.png'))
74
-
75
- test_image = TestImage.new
76
-
77
- normalized_image_path = test_image.normalize_image_from_base64('image/png', base64_palleted_png)
78
-
79
- image_registry = test_image.temp_image_registry
80
- assert_equal 1, image_registry.count
81
-
82
- image_id = Digest::MD5.hexdigest(base64_palleted_png)
83
- assert_includes image_registry.keys, image_id
84
- assert_equal normalized_image_path, image_registry[image_id].path
85
-
86
- refute equal_image(data_file('image_pallete_based.png'), normalized_image_path)
87
-
88
- assert_not_palette_based_transparency_png File.read(normalized_image_path)
89
-
90
- # 2nd time
91
- assert_equal normalized_image_path,
92
- test_image.normalize_image_from_base64('image/png', base64_palleted_png)
93
- assert_equal 1, test_image.temp_image_registry.count
94
- end
95
-
96
- def test_normalize_image_from_file_with_normal_images
97
- Thinreports.config.convert_palleted_transparency_png = true
98
-
99
- [
100
- data_file('image_normal.png'),
101
- data_file('iamge_normal.jpg'),
102
- data_file('image_normal_png_noext'),
103
- data_file('image_normal_jpg_noext')
104
- ]
105
- .each do |original_image_path|
106
- test_image = TestImage.new
107
- image_path = test_image.normalize_image_from_file(original_image_path)
108
-
109
- assert_equal original_image_path, image_path
110
- assert_empty test_image.temp_image_registry
111
- end
112
- end
113
-
114
- def test_normalize_image_from_file_with_palette_transparency_png
115
- Thinreports.config.convert_palleted_transparency_png = true
116
-
117
- original_image_path = data_file('image_pallete_based.png')
118
-
119
- test_image = TestImage.new
120
-
121
- normalized_image_path = test_image.normalize_image_from_file(original_image_path)
122
- image_registry = test_image.temp_image_registry
123
-
124
- assert_equal 1, image_registry.count
125
- assert_includes image_registry.keys, original_image_path
126
-
127
- refute equal_image(original_image_path, normalized_image_path)
128
-
129
- assert_not_palette_based_transparency_png File.read(normalized_image_path)
130
-
131
- # It should never called in 2nd time or subsequent.
132
- TestImage::PNGNormalizer.stubs(:load_file).never
133
- assert_equal normalized_image_path,
134
- test_image.normalize_image_from_file(original_image_path)
135
- end
136
-
137
- def assert_not_palette_based_transparency_png(data)
138
- image_data = ChunkyPNG::Image.from_blob(data)
139
- datastream = ChunkyPNG::Datastream.from_blob(data)
140
-
141
- assert_equal ChunkyPNG::COLOR_INDEXED, image_data.palette.best_color_settings.first
142
- assert_equal nil, datastream.transparency_chunk
143
- end
144
-
145
- def equal_image(expect_path, actual_path)
146
- expect_image = File.binread(expect_path)
147
- actual_image = File.binread(actual_path)
148
- expect_image == actual_image
149
- end
150
- end