require "#{File.dirname(__FILE__)}/../../../spec_helper" describe Prawn::SVG::Calculators::AspectRatio do def test(*args) aspect = Prawn::SVG::Calculators::AspectRatio.new(*args) [[aspect.width, aspect.height], [aspect.x, aspect.y]] end it 'handles none' do expect(test('none', [50, 80], [100, 100])).to eq [[50, 80], [0, 0]] expect(test('none', [100, 100], [50, 80])).to eq [[100, 100], [0, 0]] end context 'using meet' do context 'with smaller containers than objects' do let(:coords) { [[50, 80], [100, 100]] } it 'correctly calculates the result' do expect(test('xMidYMid meet', *coords)).to eq [[50, 50], [0, 15]] expect(test('xMinYMin meet', *coords)).to eq [[50, 50], [0, 0]] expect(test('xMaxYMax meet', *coords)).to eq [[50, 50], [0, 30]] end end context 'with bigger containers than objects' do let(:coords) { [[100, 80], [50, 50]] } it 'correctly calculates the result' do expect(test('xMidYMid meet', *coords)).to eq [[80, 80], [10, 0]] expect(test('xMinYMin meet', *coords)).to eq [[80, 80], [0, 0]] expect(test('xMaxYMax meet', *coords)).to eq [[80, 80], [20, 0]] end end context 'with bigger square containers' do let(:coords) { [[100, 100], [50, 80]] } it 'correctly calculates the result' do expect(test('xMidYMid meet', *coords)).to eq [[62.5, 100], [18.75, 0]] expect(test('xMinYMin meet', *coords)).to eq [[62.5, 100], [0, 0]] expect(test('xMaxYMax meet', *coords)).to eq [[62.5, 100], [37.5, 0]] end end context 'with oddly shaped containers' do let(:coords) { [[100, 20], [50, 50]] } it 'correctly calculates the result' do expect(test('xMidYMid meet', *coords)).to eq [[20, 20], [40, 0]] expect(test('xMinYMin meet', *coords)).to eq [[20, 20], [0, 0]] expect(test('xMaxYMax meet', *coords)).to eq [[20, 20], [80, 0]] end end end context 'using slice' do context 'with smaller containers than objects' do let(:coords) { [[50, 80], [100, 100]] } it 'correctly calculates the result' do expect(test('xMidYMid slice', *coords)).to eq [[80, 80], [-15, 0]] expect(test('xMinYMin slice', *coords)).to eq [[80, 80], [0, 0]] expect(test('xMaxYMax slice', *coords)).to eq [[80, 80], [-30, 0]] end end context 'with bigger containers than objects' do let(:coords) { [[100, 80], [50, 50]] } it 'correctly calculates the result' do expect(test('xMidYMid slice', *coords)).to eq [[100, 100], [0, -10]] expect(test('xMinYMin slice', *coords)).to eq [[100, 100], [0, 0]] expect(test('xMaxYMax slice', *coords)).to eq [[100, 100], [0, -20]] end end context 'with oddly shaped containers' do let(:coords) { [[100, 20], [50, 50]] } it 'correctly calculates the result' do expect(test('xMidYMid slice', *coords)).to eq [[100, 100], [0, -40]] expect(test('xMinYMin slice', *coords)).to eq [[100, 100], [0, 0]] expect(test('xMaxYMax slice', *coords)).to eq [[100, 100], [0, -80]] end end end it "defaults to 'xMidYMid meet' if nothing is supplied" do expect(test('', [50, 80], [100, 100])).to eq test 'xMidYMid meet', [50, 80], [100, 100] end it "defaults to 'xMidYMid meet' if something invalid is supplied" do expect(test('completely invalid', [50, 80], [100, 100])).to eq test 'xMidYMid meet', [50, 80], [100, 100] end end