thinreports 0.6.0.pre3
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.
- 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
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
data/tasks/clean.rake
ADDED
data/tasks/doc.rake
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'yard'
|
|
4
|
+
|
|
5
|
+
YARD::Rake::YardocTask.new(:doc) do |yard|
|
|
6
|
+
yard.files = Dir['lib/**/*.rb']
|
|
7
|
+
yard.options = [
|
|
8
|
+
'--no-private',
|
|
9
|
+
'--readme', 'README.rdoc',
|
|
10
|
+
'--output-dir', 'doc/yardoc',
|
|
11
|
+
'--template-path', 'doc/yardoc_templates'
|
|
12
|
+
]
|
|
13
|
+
end
|
data/tasks/test.rake
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
namespace :test do
|
|
4
|
+
desc 'Run all unit tests'
|
|
5
|
+
task :unit do
|
|
6
|
+
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/..'))
|
|
7
|
+
|
|
8
|
+
files = Dir['test/unit/**/test_*.rb'] + Dir['test/unit/**/*_spec.rb']
|
|
9
|
+
files.each {|f| require f }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
desc 'Run all examples'
|
|
13
|
+
task :example do
|
|
14
|
+
$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + '/..'))
|
|
15
|
+
|
|
16
|
+
Dir['test/example/**/*.rb'].each {|f| require f }
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'test/unit/helper'
|
|
4
|
+
|
|
5
|
+
describe 'Array#simple_deep_copy' do
|
|
6
|
+
|
|
7
|
+
it 'should original not be same as copied' do
|
|
8
|
+
original = []
|
|
9
|
+
original.wont_be_same_as original.simple_deep_copy
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it 'should not immutable elements at fist node has been cloned' do
|
|
13
|
+
original = ['element', Time.now]
|
|
14
|
+
copied = original.simple_deep_copy
|
|
15
|
+
|
|
16
|
+
original.each_with_index do |o, i|
|
|
17
|
+
o.wont_be_same_as copied[i]
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it 'should immutable objects at first node returns the raw' do
|
|
22
|
+
original = [nil, 1, 100, :symbol]
|
|
23
|
+
copied = original.simple_deep_copy
|
|
24
|
+
|
|
25
|
+
original.each_with_index do |o, i|
|
|
26
|
+
o.must_be_same_as copied[i]
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'test/unit/helper'
|
|
4
|
+
|
|
5
|
+
describe 'Hash#simple_deep_copy' do
|
|
6
|
+
|
|
7
|
+
it 'should original not be same as copied' do
|
|
8
|
+
original = {}
|
|
9
|
+
original.wont_be_same_as original.simple_deep_copy
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it 'should not immutable elements at fist node has been cloned' do
|
|
13
|
+
original = {:a => 'string', :b => Time.now}
|
|
14
|
+
copied = original.simple_deep_copy
|
|
15
|
+
|
|
16
|
+
original.each do |k, v|
|
|
17
|
+
v.wont_be_same_as copied[k]
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it 'should immutable objects at first node returns the raw' do
|
|
22
|
+
original = {:a => nil, :b => 1, :c => 100, :d => :symbol}
|
|
23
|
+
copied = original.simple_deep_copy
|
|
24
|
+
|
|
25
|
+
original.each do |k, v|
|
|
26
|
+
v.must_be_same_as copied[k]
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'test/unit/helper'
|
|
4
|
+
|
|
5
|
+
describe 'String#blank?' do
|
|
6
|
+
it 'should return the true value if self is empty' do
|
|
7
|
+
''.blank?.must_equal true
|
|
8
|
+
"".blank?.must_equal true
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it 'should return the false value if self is not empty' do
|
|
12
|
+
[' ', ' ', 'string', '日本語'].each do |v|
|
|
13
|
+
v.blank?.must_equal false
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe 'NilClass#blank?' do
|
|
19
|
+
it 'should always return the true value' do
|
|
20
|
+
nil.blank?.must_equal true
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe 'OtherClasses#blank?' do
|
|
25
|
+
it 'should always return the false value' do
|
|
26
|
+
[0, 1, -1, 9.99, true, false, ::Time.now].each do |v|
|
|
27
|
+
v.blank?.must_equal false
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'test/unit/helper'
|
|
4
|
+
|
|
5
|
+
class ThinReports::Core::Format::BaseTest < MiniTest::Unit::TestCase
|
|
6
|
+
TEST_FORMAT_CONFIG = {
|
|
7
|
+
'c1' => 'c1',
|
|
8
|
+
'c2' => {
|
|
9
|
+
'c2_1' => 'c2_1'
|
|
10
|
+
},
|
|
11
|
+
'c3' => {
|
|
12
|
+
'c3_1' => {
|
|
13
|
+
'c3_1_1' => 'c3_1_1',
|
|
14
|
+
'c3_1_2' => 'c3_1_2'
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
'c4' => 'c4',
|
|
18
|
+
'c5' => 'c5',
|
|
19
|
+
'c6' => 9999,
|
|
20
|
+
'c7' => 'true',
|
|
21
|
+
'c8' => 'false',
|
|
22
|
+
'c9' => {
|
|
23
|
+
'c9_1' => 'true',
|
|
24
|
+
'c9_2' => 'false'
|
|
25
|
+
},
|
|
26
|
+
'c10' => 'c10',
|
|
27
|
+
'c11' => {
|
|
28
|
+
'c11_1' => 'c11_1'
|
|
29
|
+
},
|
|
30
|
+
'c20' => 'c20',
|
|
31
|
+
'c21' => 'c21'
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
class TestFormat < ThinReports::Core::Format::Base
|
|
35
|
+
# For testing
|
|
36
|
+
attr_reader :config
|
|
37
|
+
|
|
38
|
+
# Basic methods
|
|
39
|
+
config_reader :c1
|
|
40
|
+
config_reader :c2_1 => %w( c2 c2_1 ),
|
|
41
|
+
:c3_1_1 => %w( c3 c3_1 c3_1_1 )
|
|
42
|
+
config_reader :c4, :c5
|
|
43
|
+
config_reader 'c6'
|
|
44
|
+
|
|
45
|
+
# Alias methods
|
|
46
|
+
config_reader :c1_alias => %w( c1 ),
|
|
47
|
+
:c2_1_alias => %w( c2 c2_1 )
|
|
48
|
+
|
|
49
|
+
# Invalid methods
|
|
50
|
+
config_reader :c3_invalid => %w( c3 c3_1 not_exist_key )
|
|
51
|
+
|
|
52
|
+
# Customized methods
|
|
53
|
+
config_reader :c2_1_customized => %w( c2 c2_1 ) do |val|
|
|
54
|
+
"Customized #{val}"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Checker methods
|
|
58
|
+
config_checker 'true', :c7, :c8
|
|
59
|
+
config_checker 'true', :c9_1 => %w( c9 c9_1 ),
|
|
60
|
+
:c9_2 => %w( c9 c9_2 )
|
|
61
|
+
|
|
62
|
+
# Writer methods
|
|
63
|
+
config_writer :c10
|
|
64
|
+
config_writer :c10_alias => %w( c10 )
|
|
65
|
+
config_writer :c11_1 => %w( c11 c11_1 )
|
|
66
|
+
# Writer for not exist config on default
|
|
67
|
+
config_writer :c11_2 => %w( c11 c11_2 )
|
|
68
|
+
|
|
69
|
+
# Accessor methods
|
|
70
|
+
config_accessor :c20
|
|
71
|
+
config_accessor :c21 do |val|
|
|
72
|
+
"Customized #{val}"
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def setup
|
|
77
|
+
@format = TestFormat.new(TEST_FORMAT_CONFIG)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def test_definition_of_all_config_methods
|
|
81
|
+
methods = [:c1, :c2_1, :c3_1_1, :c4, :c5, :c6,
|
|
82
|
+
:c1_alias, :c2_1_alias,
|
|
83
|
+
:c3_invalid,
|
|
84
|
+
:c2_1_customized,
|
|
85
|
+
:c7?, :c8?, :c9_1?, :c9_2?,
|
|
86
|
+
:c10=, :c10_alias=, :c11_1=, :c11_2=,
|
|
87
|
+
:c20, :c20=, :c21, :c21=]
|
|
88
|
+
assert methods.all? {|m| TestFormat.method_defined?(m) }
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def test_readers
|
|
92
|
+
# Basic
|
|
93
|
+
assert_equal @format.c1, 'c1'
|
|
94
|
+
assert_equal @format.c2_1, 'c2_1'
|
|
95
|
+
assert_equal @format.c3_1_1, 'c3_1_1'
|
|
96
|
+
assert_equal @format.c4, 'c4'
|
|
97
|
+
assert_equal @format.c5, 'c5'
|
|
98
|
+
assert_equal @format.c6, 9999
|
|
99
|
+
# Alias
|
|
100
|
+
assert_equal @format.c1_alias, @format.c1
|
|
101
|
+
assert_equal @format.c2_1_alias, @format.c2_1
|
|
102
|
+
# Invalid location
|
|
103
|
+
assert_nil @format.c3_invalid
|
|
104
|
+
# Customized
|
|
105
|
+
assert_equal @format.c2_1_customized, 'Customized c2_1'
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def test_checkers
|
|
109
|
+
assert_equal @format.c7?, true
|
|
110
|
+
assert_equal @format.c8?, false
|
|
111
|
+
assert_equal @format.c9_1?, true
|
|
112
|
+
assert_equal @format.c9_2?, false
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def test_reader_cannot_write_value
|
|
116
|
+
assert_raises NoMethodError do
|
|
117
|
+
@format.c1 = 'write'
|
|
118
|
+
end
|
|
119
|
+
# Alias method
|
|
120
|
+
assert_raises NoMethodError do
|
|
121
|
+
@format.c1_alias = 'write'
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def test_writers
|
|
126
|
+
config = @format.config
|
|
127
|
+
|
|
128
|
+
@format.c10 = 'c1_changed'
|
|
129
|
+
assert_equal config['c10'], 'c1_changed'
|
|
130
|
+
|
|
131
|
+
@format.c10_alias = 'c10_changed_by_alias'
|
|
132
|
+
assert_equal config['c10'], 'c10_changed_by_alias'
|
|
133
|
+
|
|
134
|
+
@format.c11_1 = 'c11_1_changed'
|
|
135
|
+
assert_equal config['c11']['c11_1'], 'c11_1_changed'
|
|
136
|
+
|
|
137
|
+
@format.c11_2 = 'c11_2_created'
|
|
138
|
+
assert_equal config['c11']['c11_2'], 'c11_2_created'
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def test_accessors
|
|
142
|
+
@format.c20 = 'c20_changed'
|
|
143
|
+
assert_equal @format.c20, 'c20_changed'
|
|
144
|
+
|
|
145
|
+
@format.c21 = 'c21_changed'
|
|
146
|
+
assert_equal @format.c21, 'Customized c21_changed'
|
|
147
|
+
end
|
|
148
|
+
end
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'test/unit/helper'
|
|
4
|
+
|
|
5
|
+
class ThinReports::Core::Format::TestBuilder < MiniTest::Unit::TestCase
|
|
6
|
+
include ThinReports::TestHelpers
|
|
7
|
+
|
|
8
|
+
TEST_RAW_FORMAT = <<-'EOS'
|
|
9
|
+
{
|
|
10
|
+
"node1":"\u3042\u6f22\u5b57\uff20\u3231\u2160\u30ab\u30ca\uff76\uff85",
|
|
11
|
+
"node2":{"node2_child":"node2_child value"},
|
|
12
|
+
"layout":
|
|
13
|
+
"<svg width=\"595.2\" height=\"841.8\">
|
|
14
|
+
<g class=\"canvas\">
|
|
15
|
+
<rect x=\"100\" y=\"100\" width=\"100\" height=\"100\" fill=\"red\" x-attr=\"cleaned attr\"></rect>
|
|
16
|
+
<!--SHAPE{\"type\":\"s-tblock\",\"id\":\"t1\",\"attrs\":{\"x\":58,\"y\":103.6}}SHAPE-->
|
|
17
|
+
<!--LAYOUT<text x=\"60\" y=\"103\">t1</text>LAYOUT-->
|
|
18
|
+
</g>
|
|
19
|
+
</svg>"
|
|
20
|
+
}
|
|
21
|
+
EOS
|
|
22
|
+
|
|
23
|
+
class TestFormat < ThinReports::Core::Format::Base
|
|
24
|
+
extend ::ThinReports::Core::Format::Builder
|
|
25
|
+
|
|
26
|
+
config_reader :layout
|
|
27
|
+
config_accessor :shapes
|
|
28
|
+
|
|
29
|
+
# For test
|
|
30
|
+
public_class_method :parse_json, :build_layout, :clean,
|
|
31
|
+
:clean_with_attributes, :shape_tag
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def setup
|
|
35
|
+
@raw_format = clean_whitespaces(TEST_RAW_FORMAT)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_parse_json
|
|
39
|
+
expected_format = {
|
|
40
|
+
"node1" => "あ漢字@㈱Ⅰカナカナ",
|
|
41
|
+
"node2" => {
|
|
42
|
+
"node2_child" => "node2_child value"
|
|
43
|
+
},
|
|
44
|
+
"layout" => clean_whitespaces(<<-EOS)
|
|
45
|
+
<svg width=\"595.2\" height=\"841.8\">
|
|
46
|
+
<g class=\"canvas\">
|
|
47
|
+
<rect x=\"100\" y=\"100\" width=\"100\" height=\"100\" fill=\"red\" x-attr=\"cleaned attr\"></rect>
|
|
48
|
+
<!--SHAPE{\"type\":\"s-tblock\",\"id\":\"t1\",\"attrs\":{\"x\":58,\"y\":103.6}}SHAPE-->
|
|
49
|
+
<!--LAYOUT<text x=\"60\" y=\"103\">t1</text>LAYOUT-->
|
|
50
|
+
</g>
|
|
51
|
+
</svg>
|
|
52
|
+
EOS
|
|
53
|
+
}
|
|
54
|
+
assert_equal TestFormat.parse_json(@raw_format), expected_format
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def test_build_layout
|
|
58
|
+
format = TestFormat.new(TestFormat.parse_json(@raw_format))
|
|
59
|
+
format.shapes = {}
|
|
60
|
+
|
|
61
|
+
TestFormat.build_layout(format) do |type, f|
|
|
62
|
+
flexmock(:id => f['id'])
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
assert_equal format.layout, clean_whitespaces(<<-'EOS')
|
|
66
|
+
<svg width="595.2" height="841.8">
|
|
67
|
+
<g class="canvas">
|
|
68
|
+
<rect x="100" y="100" width="100" height="100" fill="red" x-attr="cleaned attr"></rect>
|
|
69
|
+
<%= r(:"t1")%>
|
|
70
|
+
<!--LAYOUT<text x="60" y="103">t1</text>LAYOUT-->
|
|
71
|
+
</g>
|
|
72
|
+
</svg>
|
|
73
|
+
EOS
|
|
74
|
+
assert_includes format.shapes.keys, :t1
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def test_clean
|
|
78
|
+
source = clean_whitespaces(<<-'EOS')
|
|
79
|
+
<svg width="595.2" height="841.8">
|
|
80
|
+
<rect x="100" y="100" width="100" height="100" fill="red"></rect>
|
|
81
|
+
<!--LAYOUT<text x="60" y="103">t1</text>LAYOUT-->
|
|
82
|
+
<!---LAYOUT<text x="60" y="103">t1</text>LAYOUT--->
|
|
83
|
+
</svg>
|
|
84
|
+
EOS
|
|
85
|
+
TestFormat.clean(source)
|
|
86
|
+
|
|
87
|
+
assert_equal source, clean_whitespaces(<<-'EOS')
|
|
88
|
+
<svg width="595.2" height="841.8">
|
|
89
|
+
<rect x="100" y="100" width="100" height="100" fill="red"></rect>
|
|
90
|
+
</svg>
|
|
91
|
+
EOS
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def test_clean_with_attributes
|
|
95
|
+
source = clean_whitespaces(<<-'EOS')
|
|
96
|
+
<svg width="595.2" height="841.8">
|
|
97
|
+
<!--LAYOUT<text x="60" y="103">t1</text>LAYOUT-->
|
|
98
|
+
<rect x="100" y="100" x-hoge="hoge" width="100" class="foo"></rect>
|
|
99
|
+
<!---LAYOUT<text x="60" y="103">t1</text>LAYOUT--->
|
|
100
|
+
</svg>
|
|
101
|
+
EOS
|
|
102
|
+
TestFormat.clean_with_attributes(source)
|
|
103
|
+
|
|
104
|
+
assert_equal source, clean_whitespaces(<<-'EOS')
|
|
105
|
+
<svg width="595.2" height="841.8">
|
|
106
|
+
<rect x="100" y="100" width="100"></rect>
|
|
107
|
+
</svg>
|
|
108
|
+
EOS
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def test_shape_tag
|
|
112
|
+
assert_equal TestFormat.shape_tag(flexmock(:id => :foo)), '<%= r(:"foo")%>'
|
|
113
|
+
end
|
|
114
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
|
|
3
|
+
require 'test/unit/helper'
|
|
4
|
+
|
|
5
|
+
include ThinReports::TestHelpers
|
|
6
|
+
|
|
7
|
+
describe 'OrderedHash#[]=' do
|
|
8
|
+
before do
|
|
9
|
+
skip_if_ruby19
|
|
10
|
+
@ohash = ThinReports::Core::OrderedHash.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it 'should be given keys in stored in the keys array' do
|
|
14
|
+
@ohash[:foo] = 'foo'
|
|
15
|
+
@ohash[:hoge] = 'hoge'
|
|
16
|
+
@ohash.instance_variable_get(:@keys).must_equal [:foo, :hoge]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'should properly set the given value' do
|
|
20
|
+
@ohash[:foo] = 'foo'
|
|
21
|
+
@ohash[:foo].must_equal 'foo'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'should not exist a duplicate key in store of key' do
|
|
25
|
+
@ohash[:foo] = 'foo1'
|
|
26
|
+
@ohash[:foo] = 'foo2'
|
|
27
|
+
@ohash.instance_variable_get(:@keys).uniq.size.must_equal 1
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe 'OrderedHash#each_key' do
|
|
32
|
+
it 'should get the key in the order registerd' do
|
|
33
|
+
skip_if_ruby19
|
|
34
|
+
|
|
35
|
+
ohash = ThinReports::Core::OrderedHash.new
|
|
36
|
+
(keys = [:key3, :key1, :key2]).each {|key| ohash[key] = key.to_s }
|
|
37
|
+
|
|
38
|
+
i = 0
|
|
39
|
+
ohash.each_key do |key|
|
|
40
|
+
key.must_equal keys[i]; i += 1
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
describe 'OrderedHash on Ruby 1.9' do
|
|
46
|
+
it 'should same Hash class on Ruby 1.9' do
|
|
47
|
+
skip_if_ruby18
|
|
48
|
+
|
|
49
|
+
ThinReports::Core::OrderedHash.must_be_same_as ::Hash
|
|
50
|
+
end
|
|
51
|
+
end
|