require 'spec_helper'
describe Prawn::SVG::Elements::Gradient do
let(:document) { Prawn::SVG::Document.new(svg, [800, 600], { width: 800, height: 600 }) }
let(:root_element) { Prawn::SVG::Elements::Root.new(document, document.root, []) }
let(:element) { document.gradients['flag'] }
before do
root_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: [0.0, 0.0],
to: [0.2, 1.0],
wrap: :pad,
matrix: Matrix[[100.0, 0.0, 100.0], [0.0, -100.0, 100.0], [0.0, 0.0, 1.0]],
bounding_box: [100, 100, 200, 0],
stops: [
{ offset: 0, color: 'ff0000', opacity: 1.0 },
{ offset: 0.25, color: 'ff0000', opacity: 1.0 },
{ offset: 0.5, color: 'ffffff', opacity: 1.0 },
{ offset: 0.75, color: '0000ff', opacity: 1.0 },
{ offset: 1, color: '0000ff', opacity: 1.0 }
]
)
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: [0.5, 0.2],
to: [0.0, 0.2],
r1: 0,
r2: 0.8,
wrap: :pad,
matrix: Matrix[[100.0, 0.0, 100.0], [0.0, -100.0, 100.0], [0.0, 0.0, 1.0]],
bounding_box: [100, 100, 200, 0],
stops: [
{ offset: 0, color: 'ff0000', opacity: 1.0 },
{ offset: 0.25, color: 'ff0000', opacity: 1.0 },
{ offset: 0.5, color: 'ffffff', opacity: 1.0 },
{ offset: 0.75, color: '0000ff', opacity: 1.0 },
{ offset: 1, color: '0000ff', opacity: 1.0 }
]
)
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(bounding_box: [100, 100, 200, 0]))
expect(arguments).to eq(
from: [100.0, 500.0],
to: [200.0, 600.0],
stops: [{ offset: 0, color: 'ff0000', opacity: 1.0 }, { offset: 1, color: '0000ff', opacity: 1.0 }],
matrix: Matrix[[1.0, 0.0, 0.0], [0.0, -1.0, 600.0], [0.0, 0.0, 1.0]],
wrap: :pad,
bounding_box: [100, 100, 200, 0]
)
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(bounding_box: [100, 100, 200, 0]))
expect(arguments).to eq(
from: [100.0, 500.0],
to: [200.0, 600.0],
r1: 0,
r2: 150.0,
stops: [{ offset: 0, color: 'ff0000', opacity: 1.0 }, { offset: 1, color: '0000ff', opacity: 1.0 }],
matrix: Matrix[[1.0, 0.0, 0.0], [0.0, -1.0, 600.0], [0.0, 0.0, 1.0]],
wrap: :pad,
bounding_box: [100, 100, 200, 0]
)
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: [100, 100, 200, 0]))
expect(arguments).to eq(
from: [0.0, 0.0],
to: [1.0, 1.0],
stops: [{ offset: 0, color: 'ff0000', opacity: 1.0 }, { offset: 1, color: '0000ff', opacity: 1.0 }],
matrix: Matrix[[200.0, 0.0, 150.0], [0.0, -200.0, 100.0], [0.0, 0.0, 1.0]],
wrap: :pad,
bounding_box: [100, 100, 200, 0]
)
end
end
context 'when a gradient is linked to another' do
let(:svg) do
<<-SVG
SVG
end
it 'correctly inherits the attributes from the parent element' do
arguments = document.gradients['flag-2'].gradient_arguments(double(bounding_box: [100, 100, 200, 0]))
expect(arguments).to eq(
from: [150.0, 500.0],
to: [220.0, 600.0],
stops: [{ offset: 0, color: 'ff0000', opacity: 1.0 }, { offset: 1, color: '0000ff', opacity: 1.0 }],
matrix: Matrix[[1.0, 0.0, 0.0], [0.0, -1.0, 600.0], [0.0, 0.0, 1.0]],
wrap: :pad,
bounding_box: [100, 100, 200, 0]
)
arguments = document.gradients['flag-3'].gradient_arguments(double(bounding_box: [100, 100, 200, 0]))
expect(arguments).to eq(
from: [170.0, 500.0],
to: [220.0, 600.0],
stops: [{ offset: 0, color: 'ff0000', opacity: 1.0 }, { offset: 1, color: '0000ff', opacity: 1.0 }],
matrix: Matrix[[1.0, 0.0, 0.0], [0.0, -1.0, 600.0], [0.0, 0.0, 1.0]],
wrap: :pad,
bounding_box: [100, 100, 200, 0]
)
end
end
end