thinreports 0.6.0.pre3
Sign up to get free protection for your applications and to get access to all the features.
- data/.yardopts +1 -0
- data/README.rdoc +100 -0
- data/Rakefile +10 -0
- data/doc/yardoc_templates/default/layout/html/footer.erb +10 -0
- data/lib/thinreports.rb +11 -0
- data/lib/thinreports/core.rb +20 -0
- data/lib/thinreports/core/errors.rb +58 -0
- data/lib/thinreports/core/events.rb +71 -0
- data/lib/thinreports/core/ext.rb +5 -0
- data/lib/thinreports/core/ext/array.rb +19 -0
- data/lib/thinreports/core/ext/hash.rb +19 -0
- data/lib/thinreports/core/ext/object.rb +25 -0
- data/lib/thinreports/core/format.rb +14 -0
- data/lib/thinreports/core/format/base.rb +93 -0
- data/lib/thinreports/core/format/builder.rb +65 -0
- data/lib/thinreports/core/ordered_hash.rb +39 -0
- data/lib/thinreports/core/page.rb +91 -0
- data/lib/thinreports/core/shape.rb +53 -0
- data/lib/thinreports/core/shape/base.rb +16 -0
- data/lib/thinreports/core/shape/base/interface.rb +38 -0
- data/lib/thinreports/core/shape/base/internal.rb +60 -0
- data/lib/thinreports/core/shape/basic.rb +15 -0
- data/lib/thinreports/core/shape/basic/format.rb +26 -0
- data/lib/thinreports/core/shape/basic/interface.rb +57 -0
- data/lib/thinreports/core/shape/basic/internal.rb +29 -0
- data/lib/thinreports/core/shape/list.rb +25 -0
- data/lib/thinreports/core/shape/list/configuration.rb +33 -0
- data/lib/thinreports/core/shape/list/events.rb +30 -0
- data/lib/thinreports/core/shape/list/format.rb +72 -0
- data/lib/thinreports/core/shape/list/manager.rb +209 -0
- data/lib/thinreports/core/shape/list/page.rb +118 -0
- data/lib/thinreports/core/shape/list/page_state.rb +40 -0
- data/lib/thinreports/core/shape/list/section_format.rb +32 -0
- data/lib/thinreports/core/shape/list/section_interface.rb +48 -0
- data/lib/thinreports/core/shape/list/section_internal.rb +29 -0
- data/lib/thinreports/core/shape/list/store.rb +34 -0
- data/lib/thinreports/core/shape/manager.rb +14 -0
- data/lib/thinreports/core/shape/manager/format.rb +28 -0
- data/lib/thinreports/core/shape/manager/internal.rb +87 -0
- data/lib/thinreports/core/shape/manager/target.rb +85 -0
- data/lib/thinreports/core/shape/tblock.rb +16 -0
- data/lib/thinreports/core/shape/tblock/format.rb +36 -0
- data/lib/thinreports/core/shape/tblock/formatter.rb +32 -0
- data/lib/thinreports/core/shape/tblock/formatter/basic.rb +38 -0
- data/lib/thinreports/core/shape/tblock/formatter/datetime.rb +21 -0
- data/lib/thinreports/core/shape/tblock/formatter/number.rb +49 -0
- data/lib/thinreports/core/shape/tblock/formatter/padding.rb +43 -0
- data/lib/thinreports/core/shape/tblock/interface.rb +52 -0
- data/lib/thinreports/core/shape/tblock/internal.rb +70 -0
- data/lib/thinreports/core/shape/text.rb +15 -0
- data/lib/thinreports/core/shape/text/format.rb +25 -0
- data/lib/thinreports/core/shape/text/interface.rb +16 -0
- data/lib/thinreports/core/shape/text/internal.rb +17 -0
- data/lib/thinreports/core/utils.rb +48 -0
- data/lib/thinreports/generator.rb +30 -0
- data/lib/thinreports/generator/base.rb +49 -0
- data/lib/thinreports/generator/pdf.rb +63 -0
- data/lib/thinreports/generator/pdf/document.rb +171 -0
- data/lib/thinreports/generator/pdf/document/draw_shape.rb +74 -0
- data/lib/thinreports/generator/pdf/document/font.rb +59 -0
- data/lib/thinreports/generator/pdf/document/graphics.rb +42 -0
- data/lib/thinreports/generator/pdf/document/graphics/attributes.rb +92 -0
- data/lib/thinreports/generator/pdf/document/graphics/basic.rb +132 -0
- data/lib/thinreports/generator/pdf/document/graphics/image.rb +51 -0
- data/lib/thinreports/generator/pdf/document/graphics/text.rb +130 -0
- data/lib/thinreports/generator/pdf/document/parse_color.rb +51 -0
- data/lib/thinreports/generator/pdf/document/parse_svg.rb +102 -0
- data/lib/thinreports/generator/pdf/drawer.rb +16 -0
- data/lib/thinreports/generator/pdf/drawer/base.rb +56 -0
- data/lib/thinreports/generator/pdf/drawer/list.rb +39 -0
- data/lib/thinreports/generator/pdf/drawer/list_section.rb +46 -0
- data/lib/thinreports/generator/pdf/drawer/page.rb +101 -0
- data/lib/thinreports/generator/pdf/prawn_ext.rb +36 -0
- data/lib/thinreports/generator/pxd.rb +75 -0
- data/lib/thinreports/generator/pxd/helper.rb +33 -0
- data/lib/thinreports/generator/pxd/list_renderer.rb +58 -0
- data/lib/thinreports/generator/pxd/page_renderer.rb +75 -0
- data/lib/thinreports/layout.rb +17 -0
- data/lib/thinreports/layout/base.rb +78 -0
- data/lib/thinreports/layout/configuration.rb +27 -0
- data/lib/thinreports/layout/format.rb +77 -0
- data/lib/thinreports/layout/version.rb +43 -0
- data/lib/thinreports/report.rb +31 -0
- data/lib/thinreports/report/base.rb +160 -0
- data/lib/thinreports/report/events.rb +32 -0
- data/lib/thinreports/report/internal.rb +131 -0
- data/resources/fonts/IPA_Font_License_Agreement_v1.0.txt +117 -0
- data/resources/fonts/ipag.ttf +0 -0
- data/resources/fonts/ipagp.ttf +0 -0
- data/resources/fonts/ipam.ttf +0 -0
- data/resources/fonts/ipamp.ttf +0 -0
- data/tasks/clean.rake +6 -0
- data/tasks/doc.rake +13 -0
- data/tasks/test.rake +18 -0
- data/test/unit/core/ext/array_spec.rb +29 -0
- data/test/unit/core/ext/hash_spec.rb +29 -0
- data/test/unit/core/ext/object_spec.rb +30 -0
- data/test/unit/core/format/test_base.rb +148 -0
- data/test/unit/core/format/test_builder.rb +114 -0
- data/test/unit/core/ordered_hash_spec.rb +51 -0
- data/test/unit/core/shape/base/test_interface.rb +52 -0
- data/test/unit/core/shape/base/test_internal.rb +109 -0
- data/test/unit/core/shape/basic/test_format.rb +59 -0
- data/test/unit/core/shape/basic/test_interface.rb +70 -0
- data/test/unit/core/shape/basic/test_internal.rb +42 -0
- data/test/unit/core/shape/list/test_configuration.rb +52 -0
- data/test/unit/core/shape/list/test_events.rb +28 -0
- data/test/unit/core/shape/list/test_format.rb +71 -0
- data/test/unit/core/shape/list/test_page.rb +10 -0
- data/test/unit/core/shape/list/test_page_state.rb +31 -0
- data/test/unit/core/shape/list/test_section_format.rb +46 -0
- data/test/unit/core/shape/list/test_section_interface.rb +52 -0
- data/test/unit/core/shape/list/test_section_internal.rb +30 -0
- data/test/unit/core/shape/list/test_store.rb +41 -0
- data/test/unit/core/shape/manager/test_format.rb +40 -0
- data/test/unit/core/shape/manager/test_internal.rb +137 -0
- data/test/unit/core/shape/manager/test_target.rb +109 -0
- data/test/unit/core/shape/tblock/formatter/test_basic.rb +24 -0
- data/test/unit/core/shape/tblock/formatter/test_datetime.rb +47 -0
- data/test/unit/core/shape/tblock/formatter/test_number.rb +76 -0
- data/test/unit/core/shape/tblock/formatter/test_padding.rb +72 -0
- data/test/unit/core/shape/tblock/test_format.rb +125 -0
- data/test/unit/core/shape/tblock/test_formatter.rb +28 -0
- data/test/unit/core/shape/tblock/test_interface.rb +40 -0
- data/test/unit/core/shape/tblock/test_internal.rb +139 -0
- data/test/unit/core/shape/text/test_format.rb +73 -0
- data/test/unit/core/shape/text/test_internal.rb +21 -0
- data/test/unit/core/test_events.rb +91 -0
- data/test/unit/core/test_shape.rb +35 -0
- data/test/unit/core/utils_spec.rb +56 -0
- data/test/unit/generator/pdf/document/graphics/test_attributes.rb +103 -0
- data/test/unit/generator/pdf/document/test_font.rb +54 -0
- data/test/unit/generator/pdf/document/test_graphics.rb +43 -0
- data/test/unit/generator/pdf/document/test_parse_color.rb +30 -0
- data/test/unit/generator/test_base.rb +51 -0
- data/test/unit/helper.rb +37 -0
- data/test/unit/layout/test_base.rb +92 -0
- data/test/unit/layout/test_configuration.rb +46 -0
- data/test/unit/layout/test_format.rb +104 -0
- data/test/unit/layout/test_version.rb +62 -0
- data/test/unit/report/test_base.rb +187 -0
- data/test/unit/report/test_events.rb +22 -0
- data/test/unit/report/test_internal.rb +234 -0
- data/test/unit/test_layout.rb +12 -0
- data/test/unit/test_report.rb +30 -0
- metadata +218 -0
@@ -0,0 +1,73 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'test/unit/helper'
|
4
|
+
|
5
|
+
class ThinReports::Core::Shape::Text::TestFormat < MiniTest::Unit::TestCase
|
6
|
+
include ThinReports::TestHelpers
|
7
|
+
|
8
|
+
TEST_TEXT_FORMAT = {
|
9
|
+
"type" => "s-text",
|
10
|
+
"id" => "text_1",
|
11
|
+
"display" => "true",
|
12
|
+
"text" => ["Text Content1", "Text Content2"],
|
13
|
+
"valign" => "top",
|
14
|
+
"line-height" => 60,
|
15
|
+
"box" => {
|
16
|
+
"x" => 100.0,
|
17
|
+
"y" => 100.0,
|
18
|
+
"width" => 100.0,
|
19
|
+
"height" => 100.0
|
20
|
+
},
|
21
|
+
"svg" => {
|
22
|
+
"tag" => "g",
|
23
|
+
"attrs" => {
|
24
|
+
"stroke-width" => "0",
|
25
|
+
"font-weight" => "normal",
|
26
|
+
"font-style" => "normal",
|
27
|
+
"font-family" => "Arial",
|
28
|
+
"font-size" => "12",
|
29
|
+
"text-anchor" => "start",
|
30
|
+
"fill" => "#000000",
|
31
|
+
"fill-opacity" => "1",
|
32
|
+
"text-decoration" => "none",
|
33
|
+
"letter-spacing" => "normal"
|
34
|
+
},
|
35
|
+
"content" => "<text class=\"s-text-l0\" xml:space=\"preserve\" " +
|
36
|
+
"stroke=\"none\" fill=\"inherit\" fill-opacity=\"1\" " +
|
37
|
+
"text-decoration=\"none\" x=\"92\" y=\"93\">" +
|
38
|
+
"Text Content1</text>" +
|
39
|
+
"<text class=\"s-text-l1\" xml:space=\"preserve\" " +
|
40
|
+
"stroke=\"none\" fill=\"inherit\" fill-opacity=\"1\" " +
|
41
|
+
"text-decoration=\"none\" x=\"92\" y=\"107\">" +
|
42
|
+
"Text Content2</text>"
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
# Alias
|
47
|
+
Format = ThinReports::Core::Shape::Text::Format
|
48
|
+
|
49
|
+
def test_build_format
|
50
|
+
build_format
|
51
|
+
rescue => e
|
52
|
+
flunk exception_details(e, 'Building failed.')
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_config_readers
|
56
|
+
format = Format.new(TEST_TEXT_FORMAT)
|
57
|
+
|
58
|
+
assert_instance_of ::Hash, format.box
|
59
|
+
assert_equal format.box['x'], 100.0
|
60
|
+
|
61
|
+
assert_instance_of ::Array, format.text
|
62
|
+
assert_equal format.text.first, 'Text Content1'
|
63
|
+
|
64
|
+
assert_equal format.valign, 'top'
|
65
|
+
assert_equal format.line_height, 60
|
66
|
+
|
67
|
+
assert_equal format.svg_content, TEST_TEXT_FORMAT['svg']['content']
|
68
|
+
end
|
69
|
+
|
70
|
+
def build_format
|
71
|
+
Format.build(TEST_TEXT_FORMAT)
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'test/unit/helper'
|
4
|
+
|
5
|
+
class ThinReports::Core::Shape::Text::TestInternal < MiniTest::Unit::TestCase
|
6
|
+
include ThinReports::TestHelpers
|
7
|
+
|
8
|
+
Text = ThinReports::Core::Shape::Text
|
9
|
+
|
10
|
+
def setup
|
11
|
+
format = flexmock('format')
|
12
|
+
format.should_receive(:type => 's-text')
|
13
|
+
|
14
|
+
@internal = Text::Internal.new(flexmock('parent'), format)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_type_of?
|
18
|
+
assert_equal @internal.type_of?(:text), true
|
19
|
+
assert_equal @internal.type_of?(:basic), false
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'test/unit/helper'
|
4
|
+
|
5
|
+
class ThinReports::Core::TestEvents < MiniTest::Unit::TestCase
|
6
|
+
include ThinReports::TestHelpers
|
7
|
+
|
8
|
+
# Alias
|
9
|
+
Events = ThinReports::Core::Events
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@events = Events.new(:load, :change, :blur)
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_listen
|
16
|
+
load1_handler = proc{|e| e.type }
|
17
|
+
load2_handler = proc{|e| e.type }
|
18
|
+
change_handler = proc{|e| e.target }
|
19
|
+
|
20
|
+
@events.listen(:load, &load1_handler)
|
21
|
+
@events.listen(:change, &change_handler)
|
22
|
+
# Overwrite
|
23
|
+
@events.listen(:load, &load2_handler)
|
24
|
+
|
25
|
+
# Using #on method
|
26
|
+
@events.on(:blur) do |e|
|
27
|
+
e.target
|
28
|
+
end
|
29
|
+
|
30
|
+
assert_equal @events.events.size, 3
|
31
|
+
assert_same @events.events[:change], change_handler
|
32
|
+
assert_same @events.events[:load], load2_handler
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_listen_raise_error_when_unknown_event_type_is_set
|
36
|
+
assert_raises ThinReports::Errors::UnknownEventType do
|
37
|
+
@events.listen(:unknown) {|e| e.type }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_listen_raise_error_when_no_block_is_given
|
42
|
+
assert_raises ::ArgumentError do
|
43
|
+
@events.listen(:blur)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_unlisten
|
48
|
+
@events.listen(:load) {|e| e.type }
|
49
|
+
@events.listen(:change) {|e| e.type }
|
50
|
+
@events.listen(:blur) {|e| e.type }
|
51
|
+
|
52
|
+
@events.unlisten(:load)
|
53
|
+
@events.un(:change)
|
54
|
+
@events.un(:blur)
|
55
|
+
|
56
|
+
assert_empty @events.events
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_dispatch
|
60
|
+
# Expected returns a true value
|
61
|
+
@events.listen(:change) {|e| e.type == :change }
|
62
|
+
assert_equal @events.dispatch(Events::Event.new(:change)), true
|
63
|
+
|
64
|
+
# Expected to reverse the string given as e#target
|
65
|
+
@events.on(:blur) {|e| e.target.reverse }
|
66
|
+
assert_equal @events.dispatch(Events::Event.new(:blur, '123')), '321'
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_dispatch_raise_error_when_no_event_type_is_given
|
70
|
+
assert_raises ::ArgumentError do
|
71
|
+
@events.dispatch(Events::Event.new)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_dispatch_return_nil_when_event_type_is_not_listened
|
76
|
+
assert_nil @events.dispatch(Events::Event.new(:load, self))
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_copy
|
80
|
+
@events.on(:change) {|e| e.type }
|
81
|
+
@events.on(:load) {|e| e.type }
|
82
|
+
|
83
|
+
copied = @events.copy
|
84
|
+
|
85
|
+
assert_equal @events.events, copied.events
|
86
|
+
refute_same @events.events, copied.events
|
87
|
+
|
88
|
+
@events.unlisten(:change)
|
89
|
+
refute_nil copied.dispatch(Events::Event.new(:change, self))
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'test/unit/helper'
|
4
|
+
|
5
|
+
class ThinReports::Core::TestShape < MiniTest::Unit::TestCase
|
6
|
+
include ThinReports::TestHelpers
|
7
|
+
|
8
|
+
# Alias
|
9
|
+
ShapeModule = ThinReports::Core::Shape
|
10
|
+
|
11
|
+
def test_find_by_type
|
12
|
+
assert_same ShapeModule.find_by_type('s-tblock'), ShapeModule::Tblock
|
13
|
+
assert_same ShapeModule.find_by_type('s-list'), ShapeModule::List
|
14
|
+
assert_same ShapeModule.find_by_type('s-text'), ShapeModule::Text
|
15
|
+
|
16
|
+
assert_same ShapeModule.find_by_type('s-image'), ShapeModule::Basic
|
17
|
+
assert_same ShapeModule.find_by_type('s-line'), ShapeModule::Basic
|
18
|
+
assert_same ShapeModule.find_by_type('s-rect'), ShapeModule::Basic
|
19
|
+
assert_same ShapeModule.find_by_type('s-ellipse'), ShapeModule::Basic
|
20
|
+
|
21
|
+
assert_raises ThinReports::Errors::UnknownShapeType do
|
22
|
+
ShapeModule.find_by_type('unknown')
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_Configuration
|
27
|
+
assert_same ShapeModule::Configuration('s-list'),
|
28
|
+
ShapeModule::List::Configuration
|
29
|
+
|
30
|
+
# When shape don't have a Configuration
|
31
|
+
assert_raises ThinReports::Errors::NoConfigurationFound do
|
32
|
+
ShapeModule::Configuration('s-line')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'test/unit/helper'
|
4
|
+
|
5
|
+
include ThinReports::TestHelpers
|
6
|
+
|
7
|
+
describe '#block_exec_on' do
|
8
|
+
it 'should return raw context if not given a block' do
|
9
|
+
expected = '123'
|
10
|
+
block_exec_on(expected).must_be_same_as expected
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should be run correctly without receiver if no block argument' do
|
14
|
+
block_exec_on('123', &proc{ reverse! }).must_equal '321'
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should be run correctly with an receiver if block has an argument' do
|
18
|
+
block_exec_on([2, 1, 3], &proc{ |a| a.sort! }).must_equal [1, 2, 3]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#ruby_18' do
|
23
|
+
it 'should not be run and return false if ruby version more than 1.8' do
|
24
|
+
skip_if_ruby18
|
25
|
+
|
26
|
+
ruby_18 {
|
27
|
+
flunk '#ruby_18 should not be executed!'
|
28
|
+
}.must_equal false
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should be run if ruby version less than 1.9' do
|
32
|
+
skip_if_ruby19
|
33
|
+
|
34
|
+
ruby_18 {
|
35
|
+
pass '#ruby_18 was executed correctly!'; true
|
36
|
+
}.must_equal true
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#ruby_19' do
|
41
|
+
it 'should not be run and return false if ruby version less than 1.9' do
|
42
|
+
skip_if_ruby19
|
43
|
+
|
44
|
+
ruby_19 {
|
45
|
+
flunk '#ruby_19 should not be executed!'
|
46
|
+
}.must_equal false
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should be run if ruby version more than 1.9' do
|
50
|
+
skip_if_ruby18
|
51
|
+
|
52
|
+
ruby_19 {
|
53
|
+
pass '#ruby_19 was executed correctly!'; true
|
54
|
+
}.must_equal true
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'test/unit/helper'
|
4
|
+
|
5
|
+
class ThinReports::Generator::Pdf::Graphics::TestAttributes < MiniTest::Unit::TestCase
|
6
|
+
include ThinReports::TestHelpers
|
7
|
+
|
8
|
+
class TestAttrs
|
9
|
+
include ThinReports::Generator::Pdf::Graphics
|
10
|
+
end
|
11
|
+
|
12
|
+
def setup
|
13
|
+
@attrs = TestAttrs.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_common_graphic_attrs
|
17
|
+
result = @attrs.common_graphic_attrs('stroke' => '#ff0000',
|
18
|
+
'stroke-width' => '1',
|
19
|
+
'fill' => '#0000ff')
|
20
|
+
assert_equal result.values_at(:stroke, :stroke_width, :fill),
|
21
|
+
['#ff0000', '1', '#0000ff']
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_common_graphic_attrs_with_stroke_dasharray
|
25
|
+
result1 = @attrs.common_graphic_attrs('stroke-dasharray' => '3,5')
|
26
|
+
result2 = @attrs.common_graphic_attrs('stroke-dasharray' => 'none')
|
27
|
+
result3 = @attrs.common_graphic_attrs({})
|
28
|
+
|
29
|
+
assert_equal result1[:stroke_dash], %w( 3 5 )
|
30
|
+
assert_nil result2[:stroke_dash]
|
31
|
+
assert_nil result3[:stroke_dash]
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_common_graphic_attrs_set_0_to_stroke_width_when_opacity_is_0
|
35
|
+
result = @attrs.common_graphic_attrs('stroke-width' => '1',
|
36
|
+
'stroke-opacity' => '0')
|
37
|
+
assert_equal result[:stroke_width], 0
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_common_graphic_attrs_with_block
|
41
|
+
result = @attrs.common_graphic_attrs('stroke' => '#ff0000') do |attrs|
|
42
|
+
attrs[:stroke].gsub!(/0/, 'f')
|
43
|
+
end
|
44
|
+
assert_equal result[:stroke], '#ffffff'
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_text_align
|
48
|
+
aligns = ['start', 'middle', 'end', nil]
|
49
|
+
assert_equal aligns.map {|a| @attrs.text_align(a) },
|
50
|
+
[:left, :center, :right, :left]
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_text_valign
|
54
|
+
valigns = ['top', 'center', 'bottom', nil]
|
55
|
+
assert_equal valigns.map {|a| @attrs.text_valign(a) },
|
56
|
+
[:top, :center, :bottom, :top]
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_extract_base64_string
|
60
|
+
base64 = 'data:image/png;base64,iVBORw0KGg1+/AAy/plYlzil'
|
61
|
+
assert_equal @attrs.extract_base64_string(base64),
|
62
|
+
'iVBORw0KGg1+/AAy/plYlzil'
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_font_styles_with_bold_and_italic
|
66
|
+
assert_equal @attrs.font_styles('font-weight' => 'bold'), [:bold]
|
67
|
+
assert_equal @attrs.font_styles('font-style' => 'italic'), [:italic]
|
68
|
+
|
69
|
+
refute_includes @attrs.font_styles('font-weight' => 'normal'), :bold
|
70
|
+
refute_includes @attrs.font_styles('font-style' => 'normal'), :italic
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_font_styles_with_underline_and_strikethrough_via_text_decoration
|
74
|
+
assert_equal @attrs.font_styles('text-decoration' => 'underline line-through'),
|
75
|
+
[:underline, :strikethrough]
|
76
|
+
end
|
77
|
+
|
78
|
+
def common_text_attrs
|
79
|
+
result = @attrs.common_text_attrs('font-family' => 'IPAMincho',
|
80
|
+
'font-size' => '12',
|
81
|
+
'fill' => '#000000',
|
82
|
+
'text-anchor' => 'middle',
|
83
|
+
'font-weight' => 'bold',
|
84
|
+
'text-decoration' => 'line-through')
|
85
|
+
assert_equal result.values_at(:font, :size, :color, :align, :styles),
|
86
|
+
['IPAMincho', '12', '#000000', :center, [:bold, :strikethrough]]
|
87
|
+
end
|
88
|
+
|
89
|
+
def common_text_attrs_with_letter_spacing
|
90
|
+
result1 = @attrs.common_text_attrs('letter-spacing' => '5')
|
91
|
+
result2 = @attrs.common_text_attrs('letter-spacing' => 'normal')
|
92
|
+
|
93
|
+
assert_equal result1[:letter_spacing], '5'
|
94
|
+
assert_nil result2[:letter_spacing]
|
95
|
+
end
|
96
|
+
|
97
|
+
def common_text_attrs_with_block
|
98
|
+
result = @attrs.common_text_attrs('fill' => '#000000') do |attrs|
|
99
|
+
attrs[:color].gsub!(/0/, 'f')
|
100
|
+
end
|
101
|
+
assert_equal result[:color], '#ffffff'
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'test/unit/helper'
|
4
|
+
|
5
|
+
class ThinReports::Generator::Pdf::TestFont < MiniTest::Unit::TestCase
|
6
|
+
include ThinReports::TestHelpers
|
7
|
+
|
8
|
+
# Alias
|
9
|
+
Font = ThinReports::Generator::Pdf::Font
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@doc = ThinReports::Generator::Pdf::Document.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_setup_fonts_install_builtin_fonts
|
16
|
+
Font::BUILTIN_FONTS.each_key do |font|
|
17
|
+
assert_includes @doc.internal.font_families.keys, font
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_setup_fonts_install_fallback_font
|
22
|
+
assert_includes @doc.internal.font_families.keys, 'FallbackFont'
|
23
|
+
assert_includes @doc.internal.fallback_fonts, 'FallbackFont'
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_fallback_font_has_all_styles_as_normal_IPAMincho
|
27
|
+
ipam = Font::BUILTIN_FONTS['IPAMincho'][:normal]
|
28
|
+
[:normal, :bold, :italic, :bold_italic].each do |style|
|
29
|
+
assert_same @doc.internal.font_families['FallbackFont'][style], ipam
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_setup_fonts_install_alias_fonts_of_CourierNew_and_TimesNewRoman
|
34
|
+
assert_same @doc.internal.font_families['Courier New'],
|
35
|
+
@doc.internal.font_families['Courier']
|
36
|
+
assert_same @doc.internal.font_families['Times New Roman'],
|
37
|
+
@doc.internal.font_families['Times-Roman']
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_default_family
|
41
|
+
assert_equal @doc.send(:default_family), 'Helvetica'
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_default_family_if_missing
|
45
|
+
assert_equal @doc.send(:default_family_if_missing, 'unknown font'),
|
46
|
+
@doc.send(:default_family)
|
47
|
+
assert_equal @doc.send(:default_family_if_missing, 'IPAMincho'), 'IPAMincho'
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_font_has_style?
|
51
|
+
assert_equal @doc.send(:font_has_style?, 'IPAMincho', :bold), false
|
52
|
+
assert_equal @doc.send(:font_has_style?, 'Courier New', :bold), true
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
require 'test/unit/helper'
|
4
|
+
|
5
|
+
class ThinReports::Generator::Pdf::TestGraphics < MiniTest::Unit::TestCase
|
6
|
+
include ThinReports::TestHelpers
|
7
|
+
|
8
|
+
class TestGraphics
|
9
|
+
attr_accessor :pdf
|
10
|
+
include ThinReports::Generator::Pdf::Graphics
|
11
|
+
end
|
12
|
+
|
13
|
+
def setup
|
14
|
+
@g = TestGraphics.new
|
15
|
+
@g.pdf = flexmock('pdf')
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_setup_custom_graphic_states
|
19
|
+
@g.pdf.
|
20
|
+
should_receive(:line_width).
|
21
|
+
with(TestGraphics::BASE_LINE_WIDTH).once
|
22
|
+
|
23
|
+
@g.send(:setup_custom_graphic_states)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_line_width
|
27
|
+
@g.pdf.
|
28
|
+
should_receive(:line_width).
|
29
|
+
with(10 * TestGraphics::BASE_LINE_WIDTH).once
|
30
|
+
|
31
|
+
@g.send(:line_width, 10)
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_save_graphics_state
|
35
|
+
@g.pdf.should_receive(:save_graphics_state).once
|
36
|
+
@g.send(:save_graphics_state)
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_restore_graphics_state
|
40
|
+
@g.pdf.should_receive(:restore_graphics_state).once
|
41
|
+
@g.send(:restore_graphics_state)
|
42
|
+
end
|
43
|
+
end
|