thinreports 0.6.0.pre3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (146) hide show
  1. data/.yardopts +1 -0
  2. data/README.rdoc +100 -0
  3. data/Rakefile +10 -0
  4. data/doc/yardoc_templates/default/layout/html/footer.erb +10 -0
  5. data/lib/thinreports.rb +11 -0
  6. data/lib/thinreports/core.rb +20 -0
  7. data/lib/thinreports/core/errors.rb +58 -0
  8. data/lib/thinreports/core/events.rb +71 -0
  9. data/lib/thinreports/core/ext.rb +5 -0
  10. data/lib/thinreports/core/ext/array.rb +19 -0
  11. data/lib/thinreports/core/ext/hash.rb +19 -0
  12. data/lib/thinreports/core/ext/object.rb +25 -0
  13. data/lib/thinreports/core/format.rb +14 -0
  14. data/lib/thinreports/core/format/base.rb +93 -0
  15. data/lib/thinreports/core/format/builder.rb +65 -0
  16. data/lib/thinreports/core/ordered_hash.rb +39 -0
  17. data/lib/thinreports/core/page.rb +91 -0
  18. data/lib/thinreports/core/shape.rb +53 -0
  19. data/lib/thinreports/core/shape/base.rb +16 -0
  20. data/lib/thinreports/core/shape/base/interface.rb +38 -0
  21. data/lib/thinreports/core/shape/base/internal.rb +60 -0
  22. data/lib/thinreports/core/shape/basic.rb +15 -0
  23. data/lib/thinreports/core/shape/basic/format.rb +26 -0
  24. data/lib/thinreports/core/shape/basic/interface.rb +57 -0
  25. data/lib/thinreports/core/shape/basic/internal.rb +29 -0
  26. data/lib/thinreports/core/shape/list.rb +25 -0
  27. data/lib/thinreports/core/shape/list/configuration.rb +33 -0
  28. data/lib/thinreports/core/shape/list/events.rb +30 -0
  29. data/lib/thinreports/core/shape/list/format.rb +72 -0
  30. data/lib/thinreports/core/shape/list/manager.rb +209 -0
  31. data/lib/thinreports/core/shape/list/page.rb +118 -0
  32. data/lib/thinreports/core/shape/list/page_state.rb +40 -0
  33. data/lib/thinreports/core/shape/list/section_format.rb +32 -0
  34. data/lib/thinreports/core/shape/list/section_interface.rb +48 -0
  35. data/lib/thinreports/core/shape/list/section_internal.rb +29 -0
  36. data/lib/thinreports/core/shape/list/store.rb +34 -0
  37. data/lib/thinreports/core/shape/manager.rb +14 -0
  38. data/lib/thinreports/core/shape/manager/format.rb +28 -0
  39. data/lib/thinreports/core/shape/manager/internal.rb +87 -0
  40. data/lib/thinreports/core/shape/manager/target.rb +85 -0
  41. data/lib/thinreports/core/shape/tblock.rb +16 -0
  42. data/lib/thinreports/core/shape/tblock/format.rb +36 -0
  43. data/lib/thinreports/core/shape/tblock/formatter.rb +32 -0
  44. data/lib/thinreports/core/shape/tblock/formatter/basic.rb +38 -0
  45. data/lib/thinreports/core/shape/tblock/formatter/datetime.rb +21 -0
  46. data/lib/thinreports/core/shape/tblock/formatter/number.rb +49 -0
  47. data/lib/thinreports/core/shape/tblock/formatter/padding.rb +43 -0
  48. data/lib/thinreports/core/shape/tblock/interface.rb +52 -0
  49. data/lib/thinreports/core/shape/tblock/internal.rb +70 -0
  50. data/lib/thinreports/core/shape/text.rb +15 -0
  51. data/lib/thinreports/core/shape/text/format.rb +25 -0
  52. data/lib/thinreports/core/shape/text/interface.rb +16 -0
  53. data/lib/thinreports/core/shape/text/internal.rb +17 -0
  54. data/lib/thinreports/core/utils.rb +48 -0
  55. data/lib/thinreports/generator.rb +30 -0
  56. data/lib/thinreports/generator/base.rb +49 -0
  57. data/lib/thinreports/generator/pdf.rb +63 -0
  58. data/lib/thinreports/generator/pdf/document.rb +171 -0
  59. data/lib/thinreports/generator/pdf/document/draw_shape.rb +74 -0
  60. data/lib/thinreports/generator/pdf/document/font.rb +59 -0
  61. data/lib/thinreports/generator/pdf/document/graphics.rb +42 -0
  62. data/lib/thinreports/generator/pdf/document/graphics/attributes.rb +92 -0
  63. data/lib/thinreports/generator/pdf/document/graphics/basic.rb +132 -0
  64. data/lib/thinreports/generator/pdf/document/graphics/image.rb +51 -0
  65. data/lib/thinreports/generator/pdf/document/graphics/text.rb +130 -0
  66. data/lib/thinreports/generator/pdf/document/parse_color.rb +51 -0
  67. data/lib/thinreports/generator/pdf/document/parse_svg.rb +102 -0
  68. data/lib/thinreports/generator/pdf/drawer.rb +16 -0
  69. data/lib/thinreports/generator/pdf/drawer/base.rb +56 -0
  70. data/lib/thinreports/generator/pdf/drawer/list.rb +39 -0
  71. data/lib/thinreports/generator/pdf/drawer/list_section.rb +46 -0
  72. data/lib/thinreports/generator/pdf/drawer/page.rb +101 -0
  73. data/lib/thinreports/generator/pdf/prawn_ext.rb +36 -0
  74. data/lib/thinreports/generator/pxd.rb +75 -0
  75. data/lib/thinreports/generator/pxd/helper.rb +33 -0
  76. data/lib/thinreports/generator/pxd/list_renderer.rb +58 -0
  77. data/lib/thinreports/generator/pxd/page_renderer.rb +75 -0
  78. data/lib/thinreports/layout.rb +17 -0
  79. data/lib/thinreports/layout/base.rb +78 -0
  80. data/lib/thinreports/layout/configuration.rb +27 -0
  81. data/lib/thinreports/layout/format.rb +77 -0
  82. data/lib/thinreports/layout/version.rb +43 -0
  83. data/lib/thinreports/report.rb +31 -0
  84. data/lib/thinreports/report/base.rb +160 -0
  85. data/lib/thinreports/report/events.rb +32 -0
  86. data/lib/thinreports/report/internal.rb +131 -0
  87. data/resources/fonts/IPA_Font_License_Agreement_v1.0.txt +117 -0
  88. data/resources/fonts/ipag.ttf +0 -0
  89. data/resources/fonts/ipagp.ttf +0 -0
  90. data/resources/fonts/ipam.ttf +0 -0
  91. data/resources/fonts/ipamp.ttf +0 -0
  92. data/tasks/clean.rake +6 -0
  93. data/tasks/doc.rake +13 -0
  94. data/tasks/test.rake +18 -0
  95. data/test/unit/core/ext/array_spec.rb +29 -0
  96. data/test/unit/core/ext/hash_spec.rb +29 -0
  97. data/test/unit/core/ext/object_spec.rb +30 -0
  98. data/test/unit/core/format/test_base.rb +148 -0
  99. data/test/unit/core/format/test_builder.rb +114 -0
  100. data/test/unit/core/ordered_hash_spec.rb +51 -0
  101. data/test/unit/core/shape/base/test_interface.rb +52 -0
  102. data/test/unit/core/shape/base/test_internal.rb +109 -0
  103. data/test/unit/core/shape/basic/test_format.rb +59 -0
  104. data/test/unit/core/shape/basic/test_interface.rb +70 -0
  105. data/test/unit/core/shape/basic/test_internal.rb +42 -0
  106. data/test/unit/core/shape/list/test_configuration.rb +52 -0
  107. data/test/unit/core/shape/list/test_events.rb +28 -0
  108. data/test/unit/core/shape/list/test_format.rb +71 -0
  109. data/test/unit/core/shape/list/test_page.rb +10 -0
  110. data/test/unit/core/shape/list/test_page_state.rb +31 -0
  111. data/test/unit/core/shape/list/test_section_format.rb +46 -0
  112. data/test/unit/core/shape/list/test_section_interface.rb +52 -0
  113. data/test/unit/core/shape/list/test_section_internal.rb +30 -0
  114. data/test/unit/core/shape/list/test_store.rb +41 -0
  115. data/test/unit/core/shape/manager/test_format.rb +40 -0
  116. data/test/unit/core/shape/manager/test_internal.rb +137 -0
  117. data/test/unit/core/shape/manager/test_target.rb +109 -0
  118. data/test/unit/core/shape/tblock/formatter/test_basic.rb +24 -0
  119. data/test/unit/core/shape/tblock/formatter/test_datetime.rb +47 -0
  120. data/test/unit/core/shape/tblock/formatter/test_number.rb +76 -0
  121. data/test/unit/core/shape/tblock/formatter/test_padding.rb +72 -0
  122. data/test/unit/core/shape/tblock/test_format.rb +125 -0
  123. data/test/unit/core/shape/tblock/test_formatter.rb +28 -0
  124. data/test/unit/core/shape/tblock/test_interface.rb +40 -0
  125. data/test/unit/core/shape/tblock/test_internal.rb +139 -0
  126. data/test/unit/core/shape/text/test_format.rb +73 -0
  127. data/test/unit/core/shape/text/test_internal.rb +21 -0
  128. data/test/unit/core/test_events.rb +91 -0
  129. data/test/unit/core/test_shape.rb +35 -0
  130. data/test/unit/core/utils_spec.rb +56 -0
  131. data/test/unit/generator/pdf/document/graphics/test_attributes.rb +103 -0
  132. data/test/unit/generator/pdf/document/test_font.rb +54 -0
  133. data/test/unit/generator/pdf/document/test_graphics.rb +43 -0
  134. data/test/unit/generator/pdf/document/test_parse_color.rb +30 -0
  135. data/test/unit/generator/test_base.rb +51 -0
  136. data/test/unit/helper.rb +37 -0
  137. data/test/unit/layout/test_base.rb +92 -0
  138. data/test/unit/layout/test_configuration.rb +46 -0
  139. data/test/unit/layout/test_format.rb +104 -0
  140. data/test/unit/layout/test_version.rb +62 -0
  141. data/test/unit/report/test_base.rb +187 -0
  142. data/test/unit/report/test_events.rb +22 -0
  143. data/test/unit/report/test_internal.rb +234 -0
  144. data/test/unit/test_layout.rb +12 -0
  145. data/test/unit/test_report.rb +30 -0
  146. metadata +218 -0
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+
3
+ require 'test/unit/helper'
4
+
5
+ class ThinReports::Generator::Pdf::TestParseColor < MiniTest::Unit::TestCase
6
+ include ThinReports::TestHelpers
7
+
8
+ class TestColorParser
9
+ include ThinReports::Generator::Pdf::ParseColor
10
+ end
11
+
12
+ def setup
13
+ @parser = TestColorParser.new
14
+ end
15
+
16
+ def test_parse_color_with_hexcolor
17
+ assert_equal @parser.parse_color('#ff0000'), 'ff0000'
18
+ assert_equal @parser.parse_color('000000'), '000000'
19
+ end
20
+
21
+ def test_parse_color_with_colorname
22
+ assert_equal @parser.parse_color('red'), 'ff0000'
23
+ end
24
+
25
+ def test_parse_color_with_colorname_raise_when_unknown_name_given
26
+ assert_raises ThinReports::Errors::UnsupportedColorName do
27
+ @parser.parse_color('whitesmoke')
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,51 @@
1
+ # coding: utf-8
2
+
3
+ require 'test/unit/helper'
4
+
5
+ class ThinReports::Generator::TestBase < MiniTest::Unit::TestCase
6
+ include ThinReports::TestHelpers
7
+
8
+ # Alias
9
+ Generator = ThinReports::Generator
10
+
11
+ class FooHoge < Generator::Base; end
12
+
13
+ def test_subcclasses_are_registered_as_generator_when_inherited
14
+ assert_same FooHoge, Generator.registry.delete(:foohoge)
15
+ end
16
+
17
+ def test_initialize_finalize_given_the_report
18
+ report = flexmock('report').
19
+ should_receive(:finalize).once.
20
+ should_receive(:internal).once.mock
21
+
22
+ Generator::Base.new(report)
23
+ end
24
+
25
+ def test_generate_is_abstract_method
26
+ assert_raises NotImplementedError do
27
+ new_generator.generate
28
+ end
29
+ end
30
+
31
+ def test_generate_file_is_abstract_method
32
+ assert_raises NotImplementedError do
33
+ new_generator.generate_file('output.pdf')
34
+ end
35
+ end
36
+
37
+ def test_default_layout
38
+ generator = new_generator
39
+ flexmock(generator.report).
40
+ should_receive(:default_layout).and_return(flexmock('default_layout')).once
41
+
42
+ assert_equal generator.default_layout.flexmock_name, 'default_layout'
43
+ end
44
+
45
+ def new_generator
46
+ report = flexmock('report').
47
+ should_receive(:finalize).
48
+ should_receive(:internal).and_return(flexmock('report_internal')).mock
49
+ Generator::Base.new(report)
50
+ end
51
+ end
@@ -0,0 +1,37 @@
1
+ # coding: utf-8
2
+
3
+ begin
4
+ require 'rubygems'
5
+ require 'minitest/unit'
6
+ require 'minitest/spec'
7
+ require 'flexmock'
8
+ rescue LoadError => e
9
+ $stderr.puts 'To run the unit tests, you need minitest and flexmock.'
10
+ raise e
11
+ end
12
+
13
+ # Run a test automaticaly
14
+ MiniTest::Unit.autorun
15
+
16
+ # Load misc
17
+ require 'digest/sha1'
18
+
19
+ module ThinReports::TestHelpers
20
+ include FlexMock::TestCase
21
+
22
+ def clean_whitespaces(str)
23
+ str.gsub(/^\s*|\n\s*/, '')
24
+ end
25
+
26
+ def skip_if_ruby19
27
+ if RUBY_VERSION > '1.9'
28
+ skip('This test is not required more than Ruby 1.9.')
29
+ end
30
+ end
31
+
32
+ def skip_if_ruby18
33
+ if RUBY_VERSION < '1.9'
34
+ skip('This test is not required Ruby 1.8 below.')
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,92 @@
1
+ # coding: utf-8
2
+
3
+ require 'test/unit/helper'
4
+
5
+ class ThinReports::Layout::TestBase < MiniTest::Unit::TestCase
6
+ include ThinReports::TestHelpers
7
+
8
+ # Alias
9
+ Layout = ThinReports::Layout::Base
10
+
11
+ def test_load_format_raise_error_when_file_not_found
12
+ assert_raises ThinReports::Errors::LayoutFileNotFound do
13
+ Layout.load_format('dummy.tlf')
14
+ end
15
+ end
16
+
17
+ def test_load_format
18
+ flexmock(File).should_receive(:exists? => true).once
19
+ flexmock(ThinReports::Layout::Format).should_receive(:build).once
20
+
21
+ Layout.load_format('sample.tlf')
22
+ end
23
+
24
+ def test_load_format_when_omit_the_file_extension
25
+ specified_name = 'sample'
26
+ resolved_name = 'sample.tlf'
27
+
28
+ flexmock(File).
29
+ should_receive(:exists?).with(resolved_name).and_return(true).once
30
+ flexmock(ThinReports::Layout::Format).should_receive(:build).once
31
+
32
+ Layout.load_format(specified_name)
33
+ end
34
+
35
+ def test_Page_when_not_defined_PageHelpers
36
+ assert_same Layout.Page, ThinReports::Core::Page
37
+ end
38
+
39
+ def test_Page_when_defined_PageHelpers
40
+ Layout.send(:PageHelpers, &proc{})
41
+
42
+ refute_same Layout.Page, ThinReports::Core::Page
43
+
44
+ # Teardown
45
+ ThinReports::Layout::Base.send(:remove_const, :Page)
46
+ end
47
+
48
+ def test_PageHelpers
49
+ Layout.send(:PageHelpers) do
50
+ def foo
51
+ 'foo'
52
+ end
53
+ end
54
+
55
+ assert_same Layout::Page.superclass, ThinReports::Core::Page
56
+ assert Layout::Page.method_defined?(:foo)
57
+
58
+ # Teardown
59
+ ThinReports::Layout::Base.send(:remove_const, :Page)
60
+ end
61
+
62
+ def test_initialize_with_specified_id
63
+ layout = init_layout(:id => :foo)
64
+ assert_equal layout.id, :foo
65
+ end
66
+
67
+ def test_default?
68
+ assert_equal init_layout.default?, true
69
+ assert_equal init_layout(:id => :foo).default?, false
70
+ end
71
+
72
+ def test_config
73
+ layout = init_layout
74
+ assert_instance_of ThinReports::Layout::Configuration, layout.config
75
+ end
76
+
77
+ def test_init_new_page
78
+ parent = flexmock('parent')
79
+ layout = init_layout
80
+
81
+ # Should call ThinReports::Core::Page#new with parent and layout.
82
+ flexmock(ThinReports::Core::Page).
83
+ should_receive(:new).with(parent, layout).once
84
+
85
+ layout.init_new_page(parent)
86
+ end
87
+
88
+ def init_layout(options = {})
89
+ flexmock(Layout).should_receive(:load_format => flexmock('format'))
90
+ Layout.new('dummy.tlf', options)
91
+ end
92
+ end
@@ -0,0 +1,46 @@
1
+ # coding: utf-8
2
+
3
+ require 'test/unit/helper'
4
+
5
+ class ThinReports::Layout::TestConfiguration < MiniTest::Unit::TestCase
6
+ include ThinReports::TestHelpers
7
+
8
+ # Alias
9
+ Configuration = ThinReports::Layout::Configuration
10
+
11
+ def setup
12
+ layout = flexmock('layout')
13
+ flexmock(layout).should_receive(:format => flexmock('layout_format'))
14
+
15
+ @config = Configuration.new(layout)
16
+ end
17
+
18
+ def test_undef_items_method
19
+ refute_respond_to @config, :items
20
+ end
21
+
22
+ def test_undef_values_method
23
+ refute_respond_to @config, :values
24
+ end
25
+
26
+ def test_properly_set_init_item_handler
27
+ list_format = flexmock('list_format').should_receive(:type => 's-list').once.mock
28
+ list_config = flexmock('list_config').should_receive(:new).once.mock
29
+
30
+ flexmock(ThinReports::Core::Shape).
31
+ should_receive(:Configuration).with('s-list').and_return(list_config).once
32
+
33
+ @config.manager.init_item(list_format)
34
+ end
35
+
36
+ def test_activate
37
+ list_config = flexmock('list_config').should_receive(:copy).once.mock
38
+ @config.manager.shapes[:foo] = list_config
39
+
40
+ @config.activate(:foo)
41
+ end
42
+
43
+ def test_activate_return_nil_when_unknown_shape_id
44
+ assert_nil @config.activate(:unknown)
45
+ end
46
+ end
@@ -0,0 +1,104 @@
1
+ # coding: utf-8
2
+
3
+ require 'test/unit/helper'
4
+
5
+ class ThinReports::Layout::TestFormat < MiniTest::Unit::TestCase
6
+ include ThinReports::TestHelpers
7
+
8
+ TEST_SIMPLE_FORMAT = <<-'EOF'
9
+ {
10
+ "built-at":"",
11
+ "version":"%s",
12
+ "encoding":"utf-8",
13
+ "updated-at":"20110528120710",
14
+ "finger-print":-860627816,
15
+ "config":{
16
+ "title":"Sample Layout",
17
+ "page":{
18
+ "paper-type":"A4",
19
+ "width":null,
20
+ "height":null,
21
+ "orientation":"portrait",
22
+ "margin-top":"20",
23
+ "margin-bottom":"20",
24
+ "margin-left":"20",
25
+ "margin-right":"20"
26
+ },
27
+ "option":{}
28
+ },
29
+ "svg":"<!--SHAPE{\"type\":\"s-rect\",\"id\":\"rect1\"}SHAPE-->
30
+ <!--SHAPE{\"type\":\"s-image\",\"id\":\"image1\"}SHAPE-->
31
+ <!--SHAPE{\"type\":\"s-tblock\",\"id\":\"tblock1\"}SHAPE-->
32
+ <!--SHAPE{\"type\":\"s-tblock\",\"id\":\"tblock2\"}SHAPE-->"
33
+ }
34
+ EOF
35
+
36
+ # Alias
37
+ Shape = ThinReports::Core::Shape
38
+ Layout = ThinReports::Layout
39
+
40
+ def test_build_simple_format
41
+ flexmock(Layout::Format).
42
+ should_receive(:read_format_file).and_return(create_raw_format).once
43
+
44
+ begin
45
+ format = Layout::Format.build('dummy.tlf', :force => true)
46
+ rescue => e
47
+ flunk exception_details(e, 'Faile to build.')
48
+ end
49
+
50
+ assert_equal format.shapes.size, 4
51
+ [:rect1, :image1, :tblock1, :tblock2].each do |shape|
52
+ assert_includes format.shapes.keys, shape
53
+ end
54
+ end
55
+
56
+ def test_identifier_return_the_digest_value
57
+ flexmock(Layout::Format).
58
+ should_receive(:read_format_file).and_return(create_raw_format).once
59
+
60
+ format = Layout::Format.build('dummy.tlf')
61
+ expect = Digest::SHA1.hexdigest(create_raw_format)
62
+
63
+ assert_equal format.identifier, expect.to_sym
64
+ end
65
+
66
+ def test_always_return_the_same_result_when_build_in_cached_mode
67
+ flexmock(Layout::Format).
68
+ should_receive(:read_format_file).and_return(create_raw_format).times(2)
69
+
70
+ # Run building with in cached mode.
71
+ # First time, not be cached.
72
+ result1 = Layout::Format.build('dummy.tlf')
73
+
74
+ # Later, be cached if format is same.
75
+ result2 = Layout::Format.build('dummy.tlf')
76
+
77
+ assert_same result1, result2
78
+ end
79
+
80
+ def test_build_raise_when_layout_file_is_incompatible
81
+ original_rules = Layout::Version::REQUIRED_RULES.dup
82
+ Layout::Version::REQUIRED_RULES.replace(['== 2.0.0'])
83
+
84
+ flexmock(Layout::Format).
85
+ should_receive(:read_format_file).and_return(create_raw_format('1.0.0'))
86
+
87
+ assert_raises ThinReports::Errors::IncompatibleLayoutFormat do
88
+ Layout::Format.build('dummy.tlf')
89
+ end
90
+ ensure
91
+ Layout::Version::REQUIRED_RULES.replace(original_rules)
92
+ end
93
+
94
+ def setup
95
+ flexmock(Shape::Tblock::Format).
96
+ should_receive(:build).and_return {|f| flexmock(:id => f['id']) }
97
+ flexmock(Shape::Basic::Format).
98
+ should_receive(:build).and_return {|f| flexmock(:id => f['id']) }
99
+ end
100
+
101
+ def create_raw_format(version = ThinReports::VERSION)
102
+ clean_whitespaces(TEST_SIMPLE_FORMAT) % version
103
+ end
104
+ end
@@ -0,0 +1,62 @@
1
+ # coding: utf-8
2
+
3
+ require 'test/unit/helper'
4
+
5
+ class ThinReports::Layout::TestVersion < MiniTest::Unit::TestCase
6
+ include ThinReports::TestHelpers
7
+
8
+ # Alias
9
+ Version = ThinReports::Layout::Version
10
+
11
+ def test_comparable_version
12
+ assert_equal Version.comparable_version('0.6.0'), '0.6.0.99'
13
+ assert_equal Version.comparable_version('0.6.0.pre'), '0.6.0.1'
14
+ assert_equal Version.comparable_version('0.6.0.pre2'), '0.6.0.2'
15
+ end
16
+
17
+ def test_compare_with_simple_rule
18
+ assert Version.compare('0.6.0', '== 0.6.0')
19
+ refute Version.compare('0.6.0', '== 0.6.1')
20
+
21
+ refute Version.compare('0.6.0', '> 0.6.0')
22
+ assert Version.compare('0.6.1', '> 0.6.0')
23
+ assert Version.compare('0.6.0', '> 0.5.9')
24
+ assert Version.compare('0.6.0', '> 0.6.0.pre3')
25
+ assert Version.compare('0.6.0.pre2', '> 0.6.0.pre')
26
+
27
+ assert Version.compare('0.6.0.pre', '< 0.6.0.pre3')
28
+
29
+ assert Version.compare('0.6.0', '>= 0.6.0')
30
+ assert Version.compare('0.6.0', '<= 0.6.0')
31
+ end
32
+
33
+ def test_compare_with_multiple_rules
34
+ assert Version.compare('0.6.0', '> 0.5.0', '< 1.0.0')
35
+ refute Version.compare('0.6.5', '> 0.6.0', '< 0.6.4')
36
+ end
37
+
38
+ def test_compatible?
39
+ required_rules('== 0.6.0.pre3') do
40
+ assert Version.compatible?('0.6.0.pre3')
41
+ end
42
+ end
43
+
44
+ def test_required_rules_inspect
45
+ required_rules('== 0.6.0.pre3') do
46
+ assert_equal Version.required_rules_inspect, '(== 0.6.0.pre3)'
47
+ end
48
+ required_rules('> 0.6.0', '< 0.7.0') do
49
+ assert_equal Version.required_rules_inspect, '(> 0.6.0 and < 0.7.0)'
50
+ end
51
+ end
52
+
53
+ def required_rules(*rules, &block)
54
+ original_required_rules = Version::REQUIRED_RULES.dup
55
+
56
+ Version::REQUIRED_RULES.clear
57
+ rules.each {|rule| Version::REQUIRED_RULES << rule }
58
+ block.call
59
+ ensure
60
+ original_required_rules.each {|rule| Version::REQUIRED_RULES << rule }
61
+ end
62
+ end
@@ -0,0 +1,187 @@
1
+ # coding: utf-8
2
+
3
+ require 'test/unit/helper'
4
+
5
+ class ThinReports::Report::TestBase < MiniTest::Unit::TestCase
6
+ include ThinReports::TestHelpers
7
+
8
+ # Alias
9
+ Report = ThinReports::Report
10
+
11
+ def setup
12
+ @report = Report::Base.new
13
+ end
14
+
15
+ def test_initialize_with_options
16
+ flexmock(Report::Internal).
17
+ should_receive(:new).with(Report::Base, {:layout => 'layout.tlf'}).
18
+ and_return(flexmock('report_internal')).once
19
+
20
+ report = Report::Base.new(:layout => 'layout.tlf')
21
+ assert_equal report.internal.flexmock_name, 'report_internal'
22
+ end
23
+
24
+ def test_use_layout
25
+ flexmock(@report.internal).
26
+ should_receive(:register_layout).with('layout.tlf', {:default => true}).
27
+ and_return(flexmock('layout_config')).once
28
+
29
+ assert_equal @report.use_layout('layout.tlf', :default => true).flexmock_name,
30
+ 'layout_config'
31
+ end
32
+
33
+ def test_start_new_page
34
+ layout = flexmock('layout')
35
+ layout.should_receive(:init_new_page).once
36
+
37
+ flexmock(@report.internal).
38
+ should_receive(:load_layout).and_return(layout).once.
39
+ should_receive(:add_page).and_return(flexmock('new_page')).once
40
+
41
+ assert_equal @report.start_new_page.flexmock_name, 'new_page'
42
+ end
43
+
44
+ def test_start_new_page_raise_when_no_layout_registered_yet
45
+ assert_raises ThinReports::Errors::NoRegisteredLayoutFound do
46
+ @report.start_new_page(:layout => :unknown)
47
+ end
48
+ end
49
+
50
+ def test_add_blank_page
51
+ blank_page = flexmock('blank_page')
52
+
53
+ flexmock(ThinReports::Core::BlankPage).
54
+ should_receive(:new).and_return(blank_page)
55
+
56
+ flexmock(@report.internal).
57
+ should_receive(:add_page).with(blank_page)
58
+
59
+ @report.add_blank_page
60
+ end
61
+
62
+ def test_layout_with_nil_return_the_default_layout
63
+ flexmock(@report.internal).
64
+ should_receive(:default_layout).and_return(flexmock('default_layout'))
65
+
66
+ assert_equal @report.layout.flexmock_name, 'default_layout'
67
+ end
68
+
69
+ def test_layout_with_id_raise_when_no_layout_found
70
+ assert_raises ThinReports::Errors::UnknownLayoutId do
71
+ @report.layout(:unknown)
72
+ end
73
+ end
74
+
75
+ def test_generate
76
+ setup_generator do |g|
77
+ g.should_receive(:generate).and_return('output').once
78
+ end
79
+ assert_equal @report.generate(:pdf, {:option => :value}), 'output'
80
+ end
81
+
82
+ def test_generate_file
83
+ setup_generator do |g|
84
+ g.should_receive(:generate_file).with(String).once
85
+ end
86
+ @report.generate_file(:pdf, 'output.pdf', {:option => :value})
87
+ end
88
+
89
+ def test_events
90
+ flexmock(@report.internal).
91
+ should_receive(:events).and_return(flexmock('report_events')).once
92
+
93
+ assert_equal @report.events.flexmock_name, 'report_events'
94
+ end
95
+
96
+ def test_page
97
+ flexmock(@report.internal).
98
+ should_receive(:page).and_return(flexmock('current_page')).once
99
+
100
+ assert_equal @report.page.flexmock_name, 'current_page'
101
+ end
102
+
103
+ def test_page_count
104
+ assert_equal @report.page_count, 0
105
+ end
106
+
107
+ def test_finalize
108
+ @report.finalize
109
+ assert_equal @report.finalized?, true
110
+ end
111
+
112
+ def test_Base_create
113
+ report = Report::Base.create do |r|
114
+ assert_instance_of Report::Base, r
115
+ end
116
+ assert_equal report.finalized?, true
117
+ end
118
+
119
+ def test_Base_create_raise_when_no_block_given
120
+ assert_raises ArgumentError do
121
+ Report::Base.create
122
+ end
123
+ end
124
+
125
+ def test_Base_generate
126
+ flexmock(Report::Base).new_instances.
127
+ should_receive(:generate).with(:pdf, Hash).once
128
+
129
+ flexmock(Report::Base).
130
+ should_receive(:create).with(Hash, Proc).
131
+ and_return(Report::Base.new).once
132
+
133
+ Report::Base.generate(:pdf, :report => {:layout => 'layout.tlf'},
134
+ :generator => {:option => :value}) {}
135
+ end
136
+
137
+ def test_Base_generate_raise_when_no_block_given
138
+ assert_raises ArgumentError do
139
+ Report::Base.generate(:pdf)
140
+ end
141
+ end
142
+
143
+ def test_Base_generate_file
144
+ flexmock(Report::Base).new_instances.
145
+ should_receive(:generate_file).with(:pdf, String, Hash).once
146
+
147
+ flexmock(Report::Base).
148
+ should_receive(:create).with(Hash, Proc).
149
+ and_return(Report::Base.new).once
150
+
151
+ Report::Base.generate_file(:pdf, 'output.pdf', :report => {:layout => 'layout.tlf'},
152
+ :generator => {:option => :value}) {}
153
+ end
154
+
155
+ def test_Base_generate_file_raise_when_no_block_given
156
+ assert_raises ArgumentError do
157
+ Report::Base.generate_file(:pdf, 'output.pdf')
158
+ end
159
+ end
160
+
161
+ def test_Base_init_generate_params_with_empty_options
162
+ Report::Base.send(:init_generate_params, options = {}) {}
163
+ assert_equal options.values_at(:report, :generator), [{}, {}]
164
+ end
165
+
166
+ def test_Base_init_generate_params_with_configured_options
167
+ options = {:report => {:layout => 'layout.tlf'},
168
+ :generator => {:option => :value}}
169
+ Report::Base.send(:init_generate_params, options) {}
170
+
171
+ assert_equal options[:report], {:layout => 'layout.tlf'}
172
+ assert_equal options[:generator], {:option => :value}
173
+ end
174
+
175
+ def test_Base_init_generate_params_raise_when_no_block_given
176
+ assert_raises ArgumentError do
177
+ Report::Base.send(:init_generate_params)
178
+ end
179
+ end
180
+
181
+ def setup_generator(&block)
182
+ block.call(generator = flexmock('generator'))
183
+
184
+ flexmock(ThinReports::Generator).
185
+ should_receive(:new).with(:pdf, @report, Hash).and_return(generator)
186
+ end
187
+ end