require 'spec_helper'

RSpec.describe Prawn::SVG::Elements::Marker do
  let(:svg) do
    <<-SVG
      <svg>
        <marker id="Triangle"
          viewBox="0 0 10 10" refX="0" refY="5"
          markerUnits="strokeWidth"
          markerWidth="4" markerHeight="3"
          orient="auto">
          <path d="M 0 0 L 10 5 L 0 10 z" />
        </marker>

        <line x2="10" y2="10" stroke="black" stroke-width="100" />
      </svg>
    SVG
  end

  let(:document) { Prawn::SVG::Document.new(svg, [800, 600], {width: 800, height: 600}) }

  def new_state
    state = Prawn::SVG::State.new
    state.viewport_sizing = document.sizing
    state
  end

  let(:line_element) do
    Prawn::SVG::Elements::Line.new(document, document.root.elements[2], [], new_state)
  end

  subject do
    Prawn::SVG::Elements::Marker.new(document, document.root.elements[1], [], new_state)
  end

  describe "#parse" do
    it "forces display none" do
      subject.parse
      expect(subject.properties.display).to eq 'none'
    end
  end

  describe "#apply_marker" do
    it "adds the line and its marker to the call stack" do
      subject.process
      line_element.process

      # We didn't use a marker-* attribute on the <line> tag, that's
      # why the apply_marker method wasn't automatically called as part
      # of the line_element.process call above.

      subject.apply_marker(line_element, point: [10, 10], angle: 45)

      # This example follows the example in the SVG 1.1 documentation
      # in section 11.6.3.

      expect(line_element.base_calls).to eq [
        ["stroke_color", ["000000"], {}, []],
        ["line_width", [100.0], {}, []],
        ["stroke", [], {}, [
            ["move_to", [[0.0, 600.0]], {}, []],
            ["line_to", [[10.0, 590.0]], {}, []]
          ]
        ],
        ["save", [], {}, []],
        ["transformation_matrix", [1, 0, 0, 1, 10, -10], {}, []],
        ["rotate", [-45], {origin: [0, 600.0]}, [
            ["transformation_matrix", [100.0, 0, 0, 100.0, 0, 0], {}, []],
            ["transformation_matrix", [1, 0, 0, 1, -0.0, 1.5], {}, []],
            ["rectangle", [[-0.5, 600.0], 4.0, 3.0], {}, []],
            ["clip", [], {}, []],
            ["transformation_matrix", [0.3, 0, 0, 0.3, 0, 0], {}, []],
            ["transparent", [1.0, 1.0], {}, [
                ["fill_color", ["000000"], {}, []],
                ["line_width", [1.0], {}, []],
                ["cap_style", [:butt], {}, []],
                ["join_style", [:miter], {}, []],
                ["undash", [], {}, []],
                ["save", [], {}, []],
                ["fill", [], {}, [
                    ["move_to", [[0.0, 600.0]], {}, []],
                    ["line_to", [[10.0, 595.0]], {}, []],
                    ["line_to", [[0.0, 590.0]], {}, []],
                    ["close_path", [], {}, []]
                  ]
                ],
                ["restore", [], {}, []],
              ]
            ]
          ]
        ],
        ["restore", [], {}, []]
      ]
    end
  end
end