require 'spec_helper' RSpec.describe Prawn::SVG::Pathable do class FakeElement < Prawn::SVG::Elements::Base include Prawn::SVG::Pathable def initialize(*args) super @properties = Struct.new(:marker_start, :marker_mid, :marker_end).new end public :apply_commands public :apply_markers def commands @commands ||= [ Prawn::SVG::Pathable::Move.new([10, 10]), Prawn::SVG::Pathable::Line.new([20, 20]), Prawn::SVG::Pathable::Curve.new([30, 30], [25, 20], [25, 25]), Prawn::SVG::Pathable::Close.new([10, 10]) ] end end let(:document) { Prawn::SVG::Document.new('', [800, 600], { width: 800, height: 600 }) } let(:state) { Prawn::SVG::State.new } subject do FakeElement.new(document, document.root, [], state) end describe '#bounding_box' do it 'determines the bounding box using the translated commands' do expect(subject.bounding_box).to eq [10, 590, 30, 570] end end describe '#apply_commands' do it 'applies the commands to the call stack' do subject.apply_commands expect(subject.base_calls).to eq [ ['move_to', [[10.0, 590.0]], {}, []], ['line_to', [[20.0, 580.0]], {}, []], ['curve_to', [[30.0, 570.0]], { bounds: [[25.0, 580.0], [25.0, 575.0]] }, []], ['close_path', [], {}, []] ] end end describe '#apply_markers' do let(:marker) { instance_double(Prawn::SVG::Elements::Marker, name: 'marker') } before do document.elements_by_id['triangle'] = marker end context 'with marker-start attribute specified' do before do subject.properties.marker_start = 'url(#triangle)' end it 'calls apply_marker on the marker' do expect(marker).to receive(:apply_marker).with(subject, point: [10, 10], angle: 45) subject.apply_markers end end context 'with marker-mid attribute specified' do before do subject.properties.marker_mid = 'url(#triangle)' end it 'calls apply_marker on the marker' do expect(marker).to receive(:apply_marker).with(subject, point: [20, 20], angle: 45) expect(marker).to receive(:apply_marker).with(subject, point: [30, 30], angle: -45) subject.apply_markers end end context 'with marker-end attribute specified' do before do subject.properties.marker_end = 'url(#triangle)' end it 'calls apply_marker on the marker' do expect(marker).to receive(:apply_marker).with(subject, point: [10, 10], angle: -45) subject.apply_markers end end end end