prawn 2.0.2 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/data/images/blend_modes_bottom_layer.jpg +0 -0
  3. data/data/images/blend_modes_top_layer.jpg +0 -0
  4. data/data/images/indexed_transparency.png +0 -0
  5. data/data/images/indexed_transparency_alpha.dat +0 -0
  6. data/data/images/indexed_transparency_color.dat +0 -0
  7. data/lib/prawn.rb +2 -1
  8. data/lib/prawn/document.rb +1 -0
  9. data/lib/prawn/document/internals.rb +10 -2
  10. data/lib/prawn/font.rb +14 -1
  11. data/lib/prawn/graphics.rb +2 -0
  12. data/lib/prawn/graphics/blend_mode.rb +64 -0
  13. data/lib/prawn/graphics/patterns.rb +52 -16
  14. data/lib/prawn/graphics/transformation.rb +3 -0
  15. data/lib/prawn/images/png.rb +43 -5
  16. data/lib/prawn/text/formatted/arranger.rb +25 -17
  17. data/lib/prawn/text/formatted/line_wrap.rb +2 -3
  18. data/lib/prawn/transformation_stack.rb +42 -0
  19. data/lib/prawn/version.rb +1 -1
  20. data/manual/graphics/blend_mode.rb +49 -0
  21. data/manual/graphics/graphics.rb +1 -0
  22. data/manual/graphics/soft_masks.rb +1 -1
  23. data/prawn.gemspec +4 -5
  24. data/spec/acceptance/png_spec.rb +35 -0
  25. data/spec/blend_mode_spec.rb +71 -0
  26. data/spec/document_spec.rb +72 -76
  27. data/spec/font_spec.rb +11 -11
  28. data/spec/formatted_text_arranger_spec.rb +178 -149
  29. data/spec/formatted_text_box_spec.rb +23 -23
  30. data/spec/graphics_spec.rb +67 -28
  31. data/spec/image_handler_spec.rb +7 -7
  32. data/spec/images_spec.rb +1 -1
  33. data/spec/png_spec.rb +26 -4
  34. data/spec/repeater_spec.rb +9 -9
  35. data/spec/spec_helper.rb +1 -4
  36. data/spec/text_at_spec.rb +2 -2
  37. data/spec/text_box_spec.rb +20 -16
  38. data/spec/text_spec.rb +8 -14
  39. data/spec/transformation_stack_spec.rb +63 -0
  40. data/spec/view_spec.rb +10 -10
  41. metadata +27 -31
  42. data/data/images/pal_bk.png +0 -0
  43. data/spec/acceptance/png.rb +0 -24
  44. data/spec/extensions/mocha.rb +0 -45
@@ -200,22 +200,22 @@ describe "When filling" do
200
200
  before(:each) { create_pdf }
201
201
 
202
202
  it "should default to the f operator (nonzero winding number rule)" do
203
- @pdf.renderer.expects(:add_content).with("f")
203
+ expect(@pdf.renderer).to receive(:add_content).with("f")
204
204
  @pdf.fill
205
205
  end
206
206
 
207
207
  it "should use f* for :fill_rule => :even_odd" do
208
- @pdf.renderer.expects(:add_content).with("f*")
208
+ expect(@pdf.renderer).to receive(:add_content).with("f*")
209
209
  @pdf.fill(:fill_rule => :even_odd)
210
210
  end
211
211
 
212
212
  it "should use b by default for fill_and_stroke (nonzero winding number)" do
213
- @pdf.renderer.expects(:add_content).with("b")
213
+ expect(@pdf.renderer).to receive(:add_content).with("b")
214
214
  @pdf.fill_and_stroke
215
215
  end
216
216
 
217
217
  it "should use b* for fill_and_stroke(:fill_rule => :even_odd)" do
218
- @pdf.renderer.expects(:add_content).with("b*")
218
+ expect(@pdf.renderer).to receive(:add_content).with("b*")
219
219
  @pdf.fill_and_stroke(:fill_rule => :even_odd)
220
220
  end
221
221
  end
@@ -280,10 +280,10 @@ describe "Patterns" do
280
280
  expect(pattern[:Shading][:Coords]).to eq([0, 0, @pdf.bounds.width, 0])
281
281
  expect(pattern[:Shading][:Function][:C0].zip([1, 0, 0]).all?{ |x1, x2|
282
282
  (x1 - x2).abs < 0.01
283
- }).to be_true
283
+ }).to eq true
284
284
  expect(pattern[:Shading][:Function][:C1].zip([0, 0, 1]).all?{ |x1, x2|
285
285
  (x1 - x2).abs < 0.01
286
- }).to be_true
286
+ }).to eq true
287
287
  end
288
288
 
289
289
  it "fill_gradient should set fill color to the pattern" do
@@ -319,10 +319,10 @@ describe "Patterns" do
319
319
  expect(pattern[:Shading][:Coords]).to eq([0, 0, 10, @pdf.bounds.width, 0, 20])
320
320
  expect(pattern[:Shading][:Function][:C0].zip([1, 0, 0]).all?{ |x1, x2|
321
321
  (x1 - x2).abs < 0.01
322
- }).to be_true
322
+ }).to eq true
323
323
  expect(pattern[:Shading][:Function][:C1].zip([0, 0, 1]).all?{ |x1, x2|
324
324
  (x1 - x2).abs < 0.01
325
- }).to be_true
325
+ }).to eq true
326
326
  end
327
327
 
328
328
  it "fill_gradient should set fill color to the pattern" do
@@ -343,21 +343,60 @@ describe "Patterns" do
343
343
  expect(str).to match(%r{/Pattern\s+CS\s*/SP-?\d+\s+SCN})
344
344
  end
345
345
  end
346
+
347
+ describe "gradient transformations" do
348
+ subject do
349
+ @pdf.scale 2 do
350
+ @pdf.translate 40, 40 do
351
+ @pdf.fill_gradient [0, 10], [15, 15], 'FF0000', '0000FF', opts
352
+ @pdf.fill_gradient [0, 10], 15, [15, 15], 25, 'FF0000', '0000FF', opts
353
+ end
354
+ end
355
+
356
+ grad = PDF::Inspector::Graphics::Pattern.analyze(@pdf.render)
357
+ grad.patterns.values.map { |pattern| pattern[:Matrix] }.uniq
358
+ end
359
+
360
+ context "when :apply_transformations is true" do
361
+ let(:opts) { { apply_transformations: true } }
362
+
363
+ it "uses the transformation stack to translate user co-ordinates to document co-ordinates required by /Pattern" do
364
+ expect(subject).to eq([[2, 0, 0, 2, 80, 100]])
365
+ end
366
+ end
367
+
368
+ context "when :apply_transformations is false" do
369
+ let(:opts) { { apply_transformations: false } }
370
+
371
+ it "doesn't transform the gradient" do
372
+ expect(subject).to eq([[1, 0, 0, 1, 0, 10]])
373
+ end
374
+ end
375
+
376
+ context "when :apply_transformations is unset" do
377
+ let(:opts) { {} }
378
+
379
+ it "doesn't transform the gradient and displays a warning" do
380
+ expect(@pdf).to receive(:warn).twice
381
+ expect(subject).to eq([[1, 0, 0, 1, 0, 10]])
382
+ end
383
+ end
384
+ end
346
385
  end
347
386
 
348
387
  describe "When using painting shortcuts" do
349
388
  before(:each) { create_pdf }
350
389
 
351
390
  it "should convert stroke_some_method(args) into some_method(args); stroke" do
352
- @pdf.expects(:line_to).with([100, 100])
353
- @pdf.expects(:stroke)
391
+ expect(@pdf).to receive(:line_to).with([100, 100])
392
+ expect(@pdf).to receive(:stroke)
354
393
 
355
394
  @pdf.stroke_line_to [100, 100]
356
395
  end
357
396
 
358
397
  it "should convert fill_some_method(args) into some_method(args); fill" do
359
- @pdf.expects(:line_to).with([100, 100])
360
- @pdf.expects(:fill)
398
+ expect(@pdf).to receive(:line_to).with([100, 100])
399
+ expect(@pdf).to receive(:fill)
361
400
 
362
401
  @pdf.fill_line_to [100, 100]
363
402
  end
@@ -372,22 +411,21 @@ describe "When using graphics states" do
372
411
  before(:each) { create_pdf }
373
412
 
374
413
  it "should add the right content on save_graphics_state" do
375
- @pdf.renderer.expects(:add_content).with('q')
414
+ expect(@pdf.renderer).to receive(:add_content).with('q')
376
415
 
377
416
  @pdf.save_graphics_state
378
417
  end
379
418
 
380
419
  it "should add the right content on restore_graphics_state" do
381
- @pdf.renderer.expects(:add_content).with('Q')
420
+ expect(@pdf.renderer).to receive(:add_content).with('Q')
382
421
 
383
422
  @pdf.restore_graphics_state
384
423
  end
385
424
 
386
425
  it "should save and restore when save_graphics_state is used with a block" do
387
- state = sequence "state"
388
- @pdf.renderer.expects(:add_content).with('q').in_sequence(state)
389
- @pdf.expects(:foo).in_sequence(state)
390
- @pdf.renderer.expects(:add_content).with('Q').in_sequence(state)
426
+ expect(@pdf.renderer).to receive(:add_content).with('q').ordered
427
+ allow(@pdf).to receive(:foo).ordered
428
+ expect(@pdf.renderer).to receive(:add_content).with('Q').ordered
391
429
 
392
430
  @pdf.save_graphics_state do
393
431
  @pdf.foo
@@ -503,14 +541,14 @@ describe "When using transformation matrix" do
503
541
  # part is 5 (PDF Reference, Third Edition, p. 706)
504
542
 
505
543
  it "should send the right content on transformation_matrix" do
506
- @pdf.renderer.expects(:add_content).with('1.00000 0.00000 0.12346 -1.00000 5.50000 20.00000 cm')
544
+ expect(@pdf.renderer).to receive(:add_content).with('1.00000 0.00000 0.12346 -1.00000 5.50000 20.00000 cm')
507
545
  @pdf.transformation_matrix 1, 0, 0.123456789, -1.0, 5.5, 20
508
546
  end
509
547
 
510
548
  it "should use fixed digits with very small number" do
511
549
  values = Array.new(6, 0.000000000001)
512
550
  string = Array.new(6, "0.00000").join " "
513
- @pdf.renderer.expects(:add_content).with("#{string} cm")
551
+ expect(@pdf.renderer).to receive(:add_content).with("#{string} cm")
514
552
  @pdf.transformation_matrix(*values)
515
553
  end
516
554
 
@@ -523,12 +561,13 @@ describe "When using transformation matrix" do
523
561
  it "should save the graphics state inside the given block" do
524
562
  values = Array.new(6, 0.000000000001)
525
563
  string = Array.new(6, "0.00000").join " "
526
- process = sequence "process"
527
564
 
528
- @pdf.expects(:save_graphics_state).with.in_sequence(process)
529
- @pdf.renderer.expects(:add_content).with("#{string} cm").in_sequence(process)
530
- @pdf.expects(:do_something).with.in_sequence(process)
531
- @pdf.expects(:restore_graphics_state).with.in_sequence(process)
565
+ expect(@pdf).to receive(:save_graphics_state).with(no_args).ordered
566
+ allow(@pdf.renderer).to receive(:add_content).with(any_args).twice
567
+ expect(@pdf.renderer).to receive(:add_content).with("#{string} cm").ordered
568
+ allow(@pdf).to receive(:do_something).ordered
569
+ expect(@pdf).to receive(:restore_graphics_state).with(no_args).ordered
570
+
532
571
  @pdf.transformation_matrix(*values) do
533
572
  @pdf.do_something
534
573
  end
@@ -547,7 +586,7 @@ describe "When using transformations shortcuts" do
547
586
 
548
587
  describe "#rotate" do
549
588
  it "should rotate" do
550
- @pdf.expects(:transformation_matrix).with(@cos, @sin, -@sin, @cos, 0, 0)
589
+ expect(@pdf).to receive(:transformation_matrix).with(@cos, @sin, -@sin, @cos, 0, 0)
551
590
  @pdf.rotate(@angle)
552
591
  end
553
592
  end
@@ -603,14 +642,14 @@ describe "When using transformations shortcuts" do
603
642
  describe "#translate" do
604
643
  it "should translate" do
605
644
  x, y = 12, 54.32
606
- @pdf.expects(:transformation_matrix).with(1, 0, 0, 1, x, y)
645
+ expect(@pdf).to receive(:transformation_matrix).with(1, 0, 0, 1, x, y)
607
646
  @pdf.translate(x, y)
608
647
  end
609
648
  end
610
649
 
611
650
  describe "#scale" do
612
651
  it "should scale" do
613
- @pdf.expects(:transformation_matrix).with(@factor, 0, 0, @factor, 0, 0)
652
+ expect(@pdf).to receive(:transformation_matrix).with(@factor, 0, 0, @factor, 0, 0)
614
653
  @pdf.scale(@factor)
615
654
  end
616
655
  end
@@ -5,11 +5,11 @@ require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
5
5
  describe "ImageHandler" do
6
6
  let(:image_handler) { Prawn::ImageHandler.new }
7
7
 
8
- let(:handler_a) { mock("Handler A") }
9
- let(:handler_b) { mock("Handler B") }
8
+ let(:handler_a) { double("Handler A") }
9
+ let(:handler_b) { double("Handler B") }
10
10
 
11
11
  it "finds the image handler for an image" do
12
- handler_a.expects(:can_render? => true)
12
+ allow(handler_a).to receive(:can_render?).and_return(true)
13
13
 
14
14
  image_handler.register(handler_a)
15
15
  image_handler.register(handler_b)
@@ -19,7 +19,7 @@ describe "ImageHandler" do
19
19
  end
20
20
 
21
21
  it "can prepend handlers" do
22
- handler_b.expects(:can_render? => true)
22
+ allow(handler_b).to receive(:can_render?).and_return(true)
23
23
 
24
24
  image_handler.register(handler_a)
25
25
  image_handler.register!(handler_b)
@@ -29,7 +29,7 @@ describe "ImageHandler" do
29
29
  end
30
30
 
31
31
  it "can unregister a handler" do
32
- handler_b.expects(:can_render? => true)
32
+ allow(handler_b).to receive(:can_render?).and_return(true)
33
33
 
34
34
  image_handler.register(handler_a)
35
35
  image_handler.register(handler_b)
@@ -41,8 +41,8 @@ describe "ImageHandler" do
41
41
  end
42
42
 
43
43
  it "raises an error when no matching handler is found" do
44
- handler_a.expects(:can_render? => false)
45
- handler_b.expects(:can_render? => false)
44
+ allow(handler_a).to receive(:can_render?).and_return(false)
45
+ allow(handler_b).to receive(:can_render?).and_return(false)
46
46
 
47
47
  image_handler.register(handler_a)
48
48
  image_handler.register(handler_b)
@@ -114,7 +114,7 @@ describe "the image() function" do
114
114
  end
115
115
 
116
116
  it "should not start a new page just for a stretchy bounding box" do
117
- @pdf.expects(:start_new_page).times(0)
117
+ expect(@pdf).to_not receive(:start_new_page)
118
118
  @pdf.bounding_box([0, @pdf.cursor], :width => @pdf.bounds.width) do
119
119
  @pdf.image @filename
120
120
  end
@@ -95,10 +95,32 @@ describe "When reading an RGB PNG file with transparency (color type 2)" do
95
95
  end
96
96
 
97
97
  describe "When reading an indexed color PNG file with transparency (color type 3)" do
98
- it "raises a not supported error" do
99
- bin = File.binread("#{Prawn::DATADIR}/images/pal_bk.png")
100
- expect { Prawn::Images::PNG.new(bin) }.to(
101
- raise_error(Prawn::Errors::UnsupportedImageType))
98
+ let(:filename) { "#{Prawn::DATADIR}/images/indexed_transparency.png" }
99
+ let(:color_filename) { "#{Prawn::DATADIR}/images/indexed_transparency_color.dat" }
100
+ let(:transparency_filename) { "#{Prawn::DATADIR}/images/indexed_transparency_alpha.dat" }
101
+ let(:img_data) { File.binread(filename) }
102
+ let(:png) { Prawn::Images::PNG.new(img_data) }
103
+
104
+ it "reads the attributes from the header chunk correctly" do
105
+ expect(png.width).to eq(200)
106
+ expect(png.height).to eq(200)
107
+ expect(png.bits).to eq(8)
108
+ expect(png.color_type).to eq(3)
109
+ expect(png.compression_method).to eq(0)
110
+ expect(png.filter_method).to eq(0)
111
+ expect(png.interlace_method).to eq(0)
112
+ end
113
+
114
+ it "reads the image data correctly" do
115
+ data = Zlib::Inflate.inflate(File.binread(color_filename))
116
+ expect(png.img_data).to eq(data)
117
+ end
118
+
119
+ it "reads the image transparency correctly" do
120
+ png.split_alpha_channel!
121
+
122
+ data = Zlib::Inflate.inflate(File.binread(transparency_filename))
123
+ expect(png.alpha_channel).to eq(data)
102
124
  end
103
125
  end
104
126
 
@@ -7,7 +7,7 @@ describe "Repeaters" do
7
7
  orig_count = Prawn::Repeater.count
8
8
 
9
9
  doc = sample_document
10
- doc.expects(:create_stamp).with("prawn_repeater(#{orig_count})")
10
+ expect(doc).to receive(:create_stamp).with("prawn_repeater(#{orig_count})")
11
11
 
12
12
  r = repeater(doc, :all) { :do_nothing }
13
13
 
@@ -18,7 +18,7 @@ describe "Repeaters" do
18
18
  doc = sample_document
19
19
  r = repeater(doc, :all) { :do_nothing }
20
20
 
21
- expect((1..doc.page_count).all? { |i| r.match?(i) }).to be_true
21
+ expect((1..doc.page_count).all? { |i| r.match?(i) }).to eq true
22
22
  end
23
23
 
24
24
  it "must provide an :odd filter" do
@@ -27,8 +27,8 @@ describe "Repeaters" do
27
27
 
28
28
  odd, even = (1..doc.page_count).partition(&:odd?)
29
29
 
30
- expect(odd.all? { |i| r.match?(i) }).to be_true
31
- expect(even.any? { |i| r.match?(i) }).to be_false
30
+ expect(odd.all? { |i| r.match?(i) }).to eq true
31
+ expect(even.any? { |i| r.match?(i) }).to eq false
32
32
  end
33
33
 
34
34
  it "must be able to filter by an array of page numbers" do
@@ -54,7 +54,7 @@ describe "Repeaters" do
54
54
 
55
55
  it "must try to run a stamp if the page number matches" do
56
56
  doc = sample_document
57
- doc.expects(:stamp)
57
+ expect(doc).to receive(:stamp)
58
58
 
59
59
  repeater(doc, :odd).run(3)
60
60
  end
@@ -62,28 +62,28 @@ describe "Repeaters" do
62
62
  it "must not try to run a stamp unless the page number matches" do
63
63
  doc = sample_document
64
64
 
65
- doc.expects(:stamp).never
65
+ expect(doc).to_not receive(:stamp)
66
66
  repeater(doc, :odd).run(2)
67
67
  end
68
68
 
69
69
  it "must not try to run a stamp if dynamic is selected" do
70
70
  doc = sample_document
71
71
 
72
- doc.expects(:stamp).never
72
+ expect(doc).to_not receive(:stamp)
73
73
  (1..10).each { |p| repeater(doc, :all, true){ :do_nothing }.run(p) }
74
74
  end
75
75
 
76
76
  it "must try to run a block if the page number matches" do
77
77
  doc = sample_document
78
78
 
79
- doc.expects(:draw_text).twice
79
+ expect(doc).to receive(:draw_text).twice
80
80
  (1..10).each { |p| repeater(doc, [1, 2], true){ doc.draw_text "foo" }.run(p) }
81
81
  end
82
82
 
83
83
  it "must not try to run a block unless the page number matches" do
84
84
  doc = sample_document
85
85
 
86
- doc.expects(:draw_text).never
86
+ expect(doc).to_not receive(:draw_text)
87
87
  repeater(doc, :odd, true){ doc.draw_text "foo" }.run(2)
88
88
  end
89
89
 
@@ -18,7 +18,6 @@ Prawn.debug = true
18
18
  Prawn::Font::AFM.hide_m17n_warning = true
19
19
 
20
20
  require "rspec"
21
- require "mocha/api"
22
21
  require "pdf/reader"
23
22
  require "pdf/inspector"
24
23
 
@@ -27,9 +26,7 @@ require "pdf/inspector"
27
26
  Dir[File.dirname(__FILE__) + "/extensions/**/*.rb"].each { |f| require f }
28
27
 
29
28
  RSpec.configure do |config|
30
- config.mock_framework = :mocha
31
29
  config.include EncodingHelpers
32
- config.treat_symbols_as_metadata_keys_with_true_values = true
33
30
  end
34
31
 
35
32
  def create_pdf(klass = Prawn::Document)
@@ -41,7 +38,7 @@ RSpec::Matchers.define :have_parseable_xobjects do
41
38
  expect { PDF::Inspector::XObject.analyze(actual.render) }.not_to raise_error
42
39
  true
43
40
  end
44
- failure_message_for_should do |actual|
41
+ failure_message do |actual|
45
42
  "expected that #{actual}'s XObjects could be successfully parsed"
46
43
  end
47
44
  end
@@ -58,7 +58,7 @@ describe "#draw_text" do
58
58
 
59
59
  text = rotated_text_inspector.analyze(@pdf.render)
60
60
 
61
- expect(text.tm_operator_used).to(be_true)
61
+ expect(text.tm_operator_used).to eq true
62
62
  end
63
63
 
64
64
  it "should not use rotation matrix by default" do
@@ -66,7 +66,7 @@ describe "#draw_text" do
66
66
 
67
67
  text = rotated_text_inspector.analyze(@pdf.render)
68
68
 
69
- expect(text.tm_operator_used).to(be_false)
69
+ expect(text.tm_operator_used).to eq false
70
70
  end
71
71
 
72
72
  it "should allow overriding default font for a single instance" do
@@ -3,43 +3,45 @@
3
3
  require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper")
4
4
 
5
5
  describe "Text::Box#nothing_printed?" do
6
- it "should be_true when nothing printed" do
6
+ it "returns true when nothing printed" do
7
7
  create_pdf
8
8
  string = "Hello world, how are you?\nI'm fine, thank you."
9
9
  text_box = Prawn::Text::Box.new(string,
10
10
  :height => 2,
11
11
  :document => @pdf)
12
12
  text_box.render
13
- expect(text_box.nothing_printed?).to be_true
13
+ expect(text_box.nothing_printed?).to eq true
14
14
  end
15
- it "should be_false when something printed" do
15
+
16
+ it "returns false when something printed" do
16
17
  create_pdf
17
18
  string = "Hello world, how are you?\nI'm fine, thank you."
18
19
  text_box = Prawn::Text::Box.new(string,
19
20
  :height => 14,
20
21
  :document => @pdf)
21
22
  text_box.render
22
- expect(text_box.nothing_printed?).to be_false
23
+ expect(text_box.nothing_printed?).to eq false
23
24
  end
24
25
  end
25
26
 
26
27
  describe "Text::Box#everything_printed?" do
27
- it "should be_false when not everything printed" do
28
+ it "returns false when not everything printed" do
28
29
  create_pdf
29
30
  string = "Hello world, how are you?\nI'm fine, thank you."
30
31
  text_box = Prawn::Text::Box.new(string,
31
32
  :height => 14,
32
33
  :document => @pdf)
33
34
  text_box.render
34
- expect(text_box.everything_printed?).to be_false
35
+ expect(text_box.everything_printed?).to eq false
35
36
  end
36
- it "should be_true when everything printed" do
37
+
38
+ it "returns true when everything printed" do
37
39
  create_pdf
38
40
  string = "Hello world, how are you?\nI'm fine, thank you."
39
41
  text_box = Prawn::Text::Box.new(string,
40
42
  :document => @pdf)
41
43
  text_box.render
42
- expect(text_box.everything_printed?).to be_true
44
+ expect(text_box.everything_printed?).to eq true
43
45
  end
44
46
  end
45
47
 
@@ -186,28 +188,30 @@ describe "Text::Box with :draw_text_callback" do
186
188
  before(:each) { create_pdf }
187
189
 
188
190
  it "hits the callback whenever text is drawn" do
189
- draw_block = stub
190
- draw_block.expects(:kick).with("this text is long enough to")
191
- draw_block.expects(:kick).with("span two lines")
191
+ draw_block = spy("Draw block")
192
192
 
193
193
  @pdf.text_box "this text is long enough to span two lines",
194
194
  :width => 150,
195
195
  :draw_text_callback => lambda { |text, _| draw_block.kick(text) }
196
+
197
+ expect(draw_block).to have_received(:kick).with("this text is long enough to")
198
+ expect(draw_block).to have_received(:kick).with("span two lines")
196
199
  end
197
200
 
198
201
  it "hits the callback once per fragment for :inline_format" do
199
- draw_block = stub
200
- draw_block.expects(:kick).with("this text has ")
201
- draw_block.expects(:kick).with("fancy")
202
- draw_block.expects(:kick).with(" formatting")
202
+ draw_block = spy("Draw block")
203
203
 
204
204
  @pdf.text_box "this text has <b>fancy</b> formatting",
205
205
  :inline_format => true, :width => 500,
206
206
  :draw_text_callback => lambda { |text, _| draw_block.kick(text) }
207
+
208
+ expect(draw_block).to have_received(:kick).with("this text has ")
209
+ expect(draw_block).to have_received(:kick).with("fancy")
210
+ expect(draw_block).to have_received(:kick).with(" formatting")
207
211
  end
208
212
 
209
213
  it "does not call #draw_text!" do
210
- @pdf.expects(:draw_text!).never
214
+ expect(@pdf).to_not receive(:draw_text!)
211
215
  @pdf.text_box "some text", :width => 500,
212
216
  :draw_text_callback => lambda { |_, _| }
213
217
  end