spec/prawn/svg/element_spec.rb in prawn-svg-0.20.0 vs spec/prawn/svg/element_spec.rb in prawn-svg-0.21.0
- old
+ new
@@ -1,16 +1,18 @@
require File.dirname(__FILE__) + '/../../spec_helper'
describe Prawn::Svg::Element do
- before :each do
- e = double(:attributes => {}, :name => "path")
+ let(:document) { double(css_parser: nil) }
+ let(:e) { double(:attributes => {}, :name => "path") }
+ let(:element) { Prawn::Svg::Element.new(document, e, [], {}) }
- @document = Struct.new(:fallback_font_name, :css_parser, :warnings).new("Courier", nil, [])
- @element = Prawn::Svg::Element.new(@document, e, [], {})
- end
+ describe "#parse_font_attributes_and_call" do
+ before do
+ @document = Struct.new(:fallback_font_name, :css_parser, :warnings).new("Courier", nil, [])
+ @element = Prawn::Svg::Element.new(@document, e, [], {})
+ end
- describe :parse_font_attributes_and_call do
it "uses a font if it can find it" do
@element.should_receive(:add_call_and_enter).with('font', 'Helvetica', :style => :normal)
@element.attributes["font-family"] = "Helvetica"
@element.send :parse_font_attributes_and_call
@@ -29,8 +31,97 @@
@element.should_not_receive(:add_call_and_enter)
@element.attributes["font-family"] = "Font That Doesn't Exist"
@element.send :parse_font_attributes_and_call
@document.warnings.length.should == 1
+ end
+ end
+
+ describe "#parse_fill_and_stroke_attributes_and_call" do
+ subject { element.send :parse_fill_and_stroke_attributes_and_call }
+
+ it "doesn't change anything if no fill attribute provided" do
+ subject
+ expect(element.state[:fill]).to be nil
+ end
+
+ it "doesn't change anything if 'inherit' fill attribute provided" do
+ element.attributes['fill'] = 'inherit'
+ subject
+ expect(element.state[:fill]).to be nil
+ end
+
+ it "turns off filling if 'none' fill attribute provided" do
+ element.attributes['fill'] = 'none'
+ subject
+ expect(element.state[:fill]).to be false
+ end
+
+ it "uses the fill attribute's color" do
+ expect(element).to receive(:add_call).with('fill_color', 'ff0000')
+ element.attributes['fill'] = 'red'
+ subject
+ expect(element.state[:fill]).to be true
+ end
+
+ it "uses black if the fill attribute's color is unparseable" do
+ expect(element).to receive(:add_call).with('fill_color', '000000')
+ element.attributes['fill'] = 'blarble'
+ subject
+ expect(element.state[:fill]).to be true
+ end
+
+ it "uses the color attribute if 'currentColor' fill attribute provided" do
+ expect(element).to receive(:add_call).with('fill_color', 'ff0000')
+ element.attributes['fill'] = 'currentColor'
+ element.attributes['color'] = 'red'
+ subject
+ expect(element.state[:fill]).to be true
+ end
+
+ it "turns off filling if UnresolvableURLWithNoFallbackError is raised" do
+ element.attributes['fill'] = 'url()'
+ subject
+ expect(element.state[:fill]).to be false
+ end
+ end
+
+ describe "#parse_transform_attribute_and_call" do
+ subject { element.send :parse_transform_attribute_and_call }
+
+ describe "translate" do
+ it "handles a missing y argument" do
+ expect(element).to receive(:add_call_and_enter).with('translate', -5.5, 0)
+ expect(document).to receive(:distance).with(-5.5, :x).and_return(-5.5)
+ expect(document).to receive(:distance).with(0.0, :y).and_return(0.0)
+
+ element.attributes['transform'] = 'translate(-5.5)'
+ subject
+ end
+ end
+
+ describe "rotate" do
+ it "handles a single angle argument" do
+ expect(element).to receive(:add_call_and_enter).with('rotate', -5.5, :origin => [0, 0])
+ expect(document).to receive(:y).with('0').and_return(0)
+
+ element.attributes['transform'] = 'rotate(5.5)'
+ subject
+ end
+
+ it "handles three arguments" do
+ expect(element).to receive(:add_call_and_enter).with('rotate', -5.5, :origin => [1.0, 2.0])
+ expect(document).to receive(:x).with(1.0).and_return(1.0)
+ expect(document).to receive(:y).with(2.0).and_return(2.0)
+
+ element.attributes['transform'] = 'rotate(5.5 1 2)'
+ subject
+ end
+
+ it "does nothing and warns if two arguments" do
+ expect(document).to receive(:warnings).and_return([])
+ element.attributes['transform'] = 'rotate(5.5 1)'
+ subject
+ end
end
end
end