require 'spec_helper'

describe 'Integration test' do
  root = "#{File.dirname(__FILE__)}/.."

  describe 'a basic SVG file' do
    let(:document) { Prawn::SVG::Document.new(svg, [800, 600], {}) }
    let(:element) { Prawn::SVG::Elements::Root.new(document) }

    let(:svg) do
      <<~SVG
        <svg width="100" height="200">
          <style><![CDATA[
            #puppy  { fill: red; }
            .animal { fill: green; }
            rect    { fill: blue; }
          ]]></style>

          <rect x="0" y="0" width="10" height="10"/>
          <rect x="10" y="0" width="10" height="10" class="animal"/>
          <rect x="20" y="0" width="10" height="10" class="animal" id="puppy"/>
          <rect x="30" y="0" width="10" height="10" class="animal" id="puppy" style="fill: yellow;"/>
        </svg>
      SVG
    end

    it 'is correctly converted to a call stack' do
      element.process

      expect(element.calls).to eq [
        ['fill_color', ['000000'], {}, []],
        ['transformation_matrix', [1, 0, 0, 1, 0, 0], {}, []],
        ['transformation_matrix', [1, 0, 0, 1, 0, 0], {}, []],
        ['save', [], {}, []], ['restore', [], {}, []],
        ['save', [], {}, []],
        ['fill_color', ['0000ff'], {}, []],
        ['fill', [], {}, [
          ['rectangle', [[0.0, 200.0], 10.0, 10.0], {}, []]
        ]],
        ['restore', [], {}, []],
        ['save', [], {}, []],
        ['fill_color', ['008000'], {}, []],
        ['fill', [], {}, [
          ['rectangle', [[10.0, 200.0], 10.0, 10.0], {}, []]
        ]],
        ['restore', [], {}, []],
        ['save', [], {}, []],
        ['fill_color', ['ff0000'], {}, []],
        ['fill', [], {}, [
          ['rectangle', [[20.0, 200.0], 10.0, 10.0], {}, []]
        ]],
        ['restore', [], {}, []],
        ['save', [], {}, []],
        ['fill_color', ['ffff00'], {}, []],
        ['fill', [], {}, [
          ['rectangle', [[30.0, 200.0], 10.0, 10.0], {}, []]
        ]],
        ['restore', [], {}, []]
      ]
    end
  end

  context 'with option :position' do
    let(:svg) { File.read("#{root}/spec/sample_svg/cubic01a.svg") }

    it 'aligns the image as requested' do
      Prawn::Document.generate("#{root}/spec/sample_output/_with_position.pdf") do |prawn|
        width = prawn.bounds.width / 3

        prawn.svg svg, width: width, position: :left
        prawn.svg svg, width: width, position: :center
        prawn.svg svg, width: width, position: :right
        prawn.svg svg, width: width, position: 50
        prawn.svg svg, width: width
      end
    end
  end

  context 'with option :vposition' do
    let(:svg) { File.read("#{root}/spec/sample_svg/cubic01a.svg") }

    it 'aligns the image as requested' do
      Prawn::Document.generate("#{root}/spec/sample_output/_with_vposition.pdf") do |prawn|
        width = prawn.bounds.width / 3

        prawn.svg svg, width: width, position: :left, vposition: :bottom
        prawn.svg svg, width: width, position: :center, vposition: :center
        prawn.svg svg, width: width, position: :right, vposition: :top
        prawn.svg svg, width: width, position: 50, vposition: 50
      end
    end
  end

  describe 'sample file rendering' do
    files = Dir["#{root}/spec/sample_svg/*.svg"]

    it 'has at least 10 SVG sample files to test' do
      files.length.should >= 10
    end

    files.each do |file|
      it "renders the #{File.basename file} sample file without warnings or crashing" do
        expect(Net::HTTP).to_not receive(:get)

        warnings = nil
        Prawn::Document.generate("#{root}/spec/sample_output/#{File.basename file}.pdf") do |prawn|
          r = prawn.svg File.read(file), at: [0, prawn.bounds.top], width: prawn.bounds.width,
            enable_file_requests_with_root: File.dirname(__FILE__) do |doc|
            doc.url_loader.add_to_cache(
              'https://raw.githubusercontent.com/mogest/prawn-svg/master/spec/sample_images/mushroom-wide.jpg', File.read("#{root}/spec/sample_images/mushroom-wide.jpg")
            )
            doc.url_loader.add_to_cache(
              'https://raw.githubusercontent.com/mogest/prawn-svg/master/spec/sample_images/mushroom-long.jpg', File.read("#{root}/spec/sample_images/mushroom-long.jpg")
            )
          end

          warnings = r[:warnings].reject do |w|
            (w =~ /Verdana/ && w =~ /is not a known font/) || w =~ /(render gradients$|waiting on the Prawn project)/
          end
        end
        warnings.should == []
      end
    end
  end

  describe 'multiple file rendering' do
    it 'renders multiple files on to the same PDF' do
      Prawn::Document.generate("#{root}/spec/sample_output/_multiple.pdf") do |prawn|
        width = prawn.bounds.width

        y = prawn.bounds.top - 12
        prawn.draw_text 'This is multiple SVGs being output to the same PDF', at: [0, y]

        y -= 12
        prawn.svg File.read("#{root}/spec/sample_svg/arcs01.svg"),   at: [0, y],         width: width / 2
        prawn.svg File.read("#{root}/spec/sample_svg/circle01.svg"), at: [width / 2, y], width: width / 2

        y -= 120
        prawn.draw_text 'Here are some more PDFs below', at: [0, y]

        y -= 12
        prawn.svg File.read("#{root}/spec/sample_svg/quad01.svg"), at: [0, y],             width: width / 3
        prawn.svg File.read("#{root}/spec/sample_svg/rect01.svg"), at: [width / 3, y],     width: width / 3
        prawn.svg File.read("#{root}/spec/sample_svg/rect02.svg"), at: [width / 3 * 2, y], width: width / 3
      end
    end
  end
end