From f4d2d759c13f626676e64e4a97c81b55947ee3bb Mon Sep 17 00:00:00 2001 From: Andy Meneely Date: Fri, 31 Oct 2014 15:55:12 -0400 Subject: [PATCH] Allowing strings for some inputs on text Also writing mock object tests --- lib/squib/graphics/text.rb | 41 ++++++------ spec/graphics/graphics_text_spec.rb | 98 +++++++++++++++++++++++++++++ spec/input_helpers_spec.rb | 7 --- spec/spec_helper.rb | 15 +++++ 4 files changed, 134 insertions(+), 27 deletions(-) create mode 100644 spec/graphics/graphics_text_spec.rb diff --git a/lib/squib/graphics/text.rb b/lib/squib/graphics/text.rb index 8c81322..7f3f66f 100644 --- a/lib/squib/graphics/text.rb +++ b/lib/squib/graphics/text.rb @@ -40,28 +40,29 @@ module Squib # :nodoc: # @api private def wrap(layout, wrap) - unless wrap.nil? - h = { :word => Pango::Layout::WRAP_WORD, - :char => Pango::Layout::WRAP_CHAR, - :word_char => Pango::Layout::WRAP_WORD_CHAR, - true => Pango::Layout::WRAP_WORD_CHAR, - false => nil, - :none => nil - } - layout.wrap = h[wrap] - end + layout.wrap = case wrap.to_s + when 'word' + Pango::Layout::WRAP_WORD + when 'char' + Pango::Layout::WRAP_CHAR + when 'word_char', true + Pango::Layout::WRAP_WORD_CHAR + else + nil + end layout end # :nodoc: # @api private def align(layout, align) - unless align.nil? - h = { :left => Pango::ALIGN_LEFT, - :right => Pango::ALIGN_RIGHT, - :center => Pango::ALIGN_CENTER - } - layout.alignment = h[align] + case align.to_s + when 'left' + layout.alignment = Pango::ALIGN_LEFT + when 'right' + layout.alignment = Pango::ALIGN_RIGHT + when 'center' + layout.alignment = Pango::ALIGN_CENTER end layout end @@ -71,10 +72,10 @@ module Squib def valign(cc, layout, x, y, valign) if layout.height > 0 ink_extents = layout.extents[1] - case valign - when :middle + case valign.to_s + when 'middle' cc.move_to(x, y + (layout.height - ink_extents.height) / (2 * Pango::SCALE)) - when :bottom + when 'bottom' cc.move_to(x, y + (layout.height - ink_extents.height) / Pango::SCALE) end end @@ -113,7 +114,7 @@ module Squib layout.justify = justify unless justify.nil? layout.spacing = spacing * Pango::SCALE unless spacing.nil? cc.update_pango_layout(layout) - valign(cc, layout, x,y, valign) + valign(cc, layout, x, y, valign) cc.update_pango_layout(layout) ; cc.show_pango_layout(layout) draw_text_hint(cc,x,y,layout,hint,angle) end diff --git a/spec/graphics/graphics_text_spec.rb b/spec/graphics/graphics_text_spec.rb new file mode 100644 index 0000000..04c704f --- /dev/null +++ b/spec/graphics/graphics_text_spec.rb @@ -0,0 +1,98 @@ +require 'spec_helper' +require 'squib' + +describe Squib::Card, '#text' do + + context 'typical inputs' do + before(:each) do + @deck = double(Squib::Deck) + @context = double(Cairo::Context) + @layout = double(Pango::Layout) + allow(Cairo::Context).to receive(:new).and_return(@context) + end + + it 'make all the expected calls on a smoke test' do + mock_squib_logger(@old_logger) do + expect(Squib.logger).to receive(:debug).once + expect(@context).to receive(:save).once + expect(@context).to receive(:set_source_color).once + expect(@context).to receive(:move_to).with(10, 15).once + expect(@context).to receive(:rotate).with(0.0).once + expect(@context).to receive(:create_pango_layout).once.and_return(@layout) + expect(@layout).to receive(:font_description=).with(Pango::FontDescription.new('Sans 12')).once + expect(@layout).to receive(:text=).with('foo').once + expect(@layout).to receive(:width=).with(20 * Pango::SCALE).once + expect(@layout).to receive(:height=).with(25 * Pango::SCALE).once + expect(@layout).to receive(:wrap=).with(nil).once + expect(@layout).to receive(:ellipsize=).with(Pango::Layout::ELLIPSIZE_NONE).once + expect(@layout).to receive(:alignment=).with(Pango::Layout::ALIGN_LEFT).once + expect(@layout).to receive(:justify=).with(false).once + expect(@layout).to receive(:spacing=).with(1.0 * Pango::SCALE).once + expect(@context).to receive(:update_pango_layout).once + expect(@layout).to receive(:height).once.and_return(25) + expect(@layout).to receive(:extents).once.and_return([0,0]) + expect(@context).to receive(:update_pango_layout).once + expect(@context).to receive(:show_pango_layout).once + expect(@context).to receive(:restore).once + + card = Squib::Card.new(@deck, 100, 150) + # text(str, font, font_size, color, + # x, y, width, height, + # markup, justify, wrap, ellipsize, + # spacing, align, valign, hint, angle) + card.text('foo', 'Sans 12', nil, '#abc', + 10, 15, 20, 25, + nil, false, false, false, + 1.0, :left, :top, nil, 0.0) + end + end + end + + context 'convenience lookups' do + before(:each) do + @deck = double(Squib::Deck) + @context = double(Cairo::Context).as_null_object + @layout = double(Pango::Layout).as_null_object + @extents = double("extents") + allow(Cairo::Context).to receive(:new).and_return(@context) + expect(@context).to receive(:create_pango_layout).once.and_return(@layout) + end + + it 'aligns right with strings' do + card = Squib::Card.new(@deck, 100, 150) + expect(@layout).to receive(:alignment=).with(Pango::Layout::ALIGN_RIGHT).once + card.text('foo', 'Sans 12', nil, '#abc', + 10, 15, 20, 50, + nil, false, false, false, + 1.0, 'right', :top, nil, 0.0) + end + + it 'aligns center with strings' do + card = Squib::Card.new(@deck, 100, 150) + expect(@layout).to receive(:alignment=).with(Pango::Layout::ALIGN_CENTER).once + card.text('foo', 'Sans 12', nil, '#abc', + 10, 15, 20, 50, + nil, false, false, false, + 1.0, 'center', :top, nil, 0.0) + end + + it 'sets wrap to char with string char' do + card = Squib::Card.new(@deck, 100, 150) + expect(@layout).to receive(:wrap=).with(Pango::Layout::WRAP_CHAR).once + card.text('foo', 'Sans 12', nil, '#abc', + 10, 15, 20, 50, + nil, false, 'char', false, + 1.0, :left, :top, nil, 0.0) + end + + it 'sets wrap to word_char with symbol word_char' do + card = Squib::Card.new(@deck, 100, 150) + expect(@layout).to receive(:wrap=).with(Pango::Layout::WRAP_WORD_CHAR).once + card.text('foo', 'Sans 12', nil, '#abc', + 10, 15, 20, 50, + nil, false, :word_char, false, + 1.0, :left, :top, nil, 0.0) + end + + end +end diff --git a/spec/input_helpers_spec.rb b/spec/input_helpers_spec.rb index 808629d..e176c68 100644 --- a/spec/input_helpers_spec.rb +++ b/spec/input_helpers_spec.rb @@ -7,13 +7,6 @@ class DummyDeck attr_accessor :layout, :cards, :custom_colors end -module Squib - def logger=(l) - @logger = l - end - module_function 'logger=' -end - describe Squib::InputHelpers do before(:each) do diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index c888e97..7b78648 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,5 +1,6 @@ require 'simplecov' require 'coveralls' +require 'squib' SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ SimpleCov::Formatter::HTMLFormatter, @@ -7,10 +8,24 @@ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[ ] SimpleCov.start +RSpec.configure do |config| + config.mock_with :rspec do |mocks| + mocks.verify_partial_doubles = true + end +end + def test_file(str) "#{File.expand_path(File.dirname(__FILE__))}/data/#{str}" end +# Refine Squib to allow setting the logger +module Squib + def logger=(l) + @logger = l + end + module_function 'logger=' +end + def mock_squib_logger(old_logger) old_logger = Squib.logger Squib.logger = instance_double(Logger)