require 'spec_helper' describe Prawn::SVG::Elements::Gradient do let(:document) { Prawn::SVG::Document.new(svg, [800, 600], { width: 800, height: 600 }) } let(:element) { Prawn::SVG::Elements::Gradient.new(document, document.root, [], fake_state) } before do allow(element).to receive(:assert_compatible_prawn_version) element.process end describe 'object bounding box with linear gradient' do let(:svg) do <<-SVG SVG end it 'is stored in the document gradients table' do expect(document.gradients['flag']).to eq element end it 'returns correct gradient arguments for an element' do arguments = element.gradient_arguments(double(bounding_box: [100, 100, 200, 0])) expect(arguments).to eq( from: [100.0, 100.0], to: [120.0, 0.0], stops: [[0, 'ff0000'], [0.25, 'ff0000'], [0.5, 'ffffff'], [0.75, '0000ff'], [1, '0000ff']], apply_transformations: true ) end it "returns nil if the element doesn't have a bounding box" do arguments = element.gradient_arguments(double(bounding_box: nil)) expect(arguments).to be nil end end describe 'object bounding box with radial gradient' do let(:svg) do <<-SVG SVG end it 'is stored in the document gradients table' do expect(document.gradients['flag']).to eq element end it 'returns correct gradient arguments for an element' do arguments = element.gradient_arguments(double(bounding_box: [100, 100, 200, 0])) expect(arguments).to eq( from: [150, 80], to: [100, 80], r1: 0, r2: Math.sqrt(((0.8 * 100)**2) + ((0.8 * 100)**2)), stops: [[0, 'ff0000'], [0.25, 'ff0000'], [0.5, 'ffffff'], [0.75, '0000ff'], [1, '0000ff']], apply_transformations: true ) end end describe 'user space on use with linear gradient' do let(:svg) do <<-SVG SVG end it 'returns correct gradient arguments for an element' do arguments = element.gradient_arguments(double) expect(arguments).to eq( from: [100.0, 100.0], to: [200.0, 0.0], stops: [[0, 'ff0000'], [1, '0000ff']], apply_transformations: true ) end end describe 'user space on use with radial gradient' do let(:svg) do <<-SVG SVG end it 'returns correct gradient arguments for an element' do arguments = element.gradient_arguments(double) expect(arguments).to eq( from: [100.0, 100.0], to: [200.0, 0.0], r1: 0, r2: 150, stops: [[0, 'ff0000'], [1, '0000ff']], apply_transformations: true ) end end context 'when gradientTransform is specified' do let(:svg) do <<-SVG SVG end it 'passes in the transform via the apply_transformations option' do arguments = element.gradient_arguments(double(bounding_box: [0, 0, 10, 10])) expect(arguments).to eq( from: [0, 0], to: [10, 10], stops: [[0, 'ff0000'], [1, '0000ff']], apply_transformations: [2, 0, 0, 2, 10, 0] ) end end end