require 'spec_helper' RSpec.describe Prawn::SVG::Properties do subject { Prawn::SVG::Properties.new } describe '#load_default_stylesheet' do it 'loads in the defaults and returns self' do expect(subject.load_default_stylesheet).to eq subject expect(subject.font_family).to eq 'sans-serif' end end describe '#set' do it 'sets a property' do result = subject.set('color', 'red') expect(result).to be expect(subject.color).to eq 'red' end it 'handles property names that are not lower case' do result = subject.set('COLor', 'red') expect(result).to be expect(subject.color).to eq 'red' end it 'right-cases and strips keywords' do subject.set('stroke-linecap', ' Round ') expect(subject.stroke_linecap).to eq 'round' end it "doesn't right-case values that aren't recognised as keywords" do subject.set('color', 'Red') expect(subject.color).to eq 'Red' end it "sets a 'keyword restricted' property to its default if the value doesn't match a keyword" do subject.set('stroke-linecap', 'invalid') expect(subject.stroke_linecap).to eq 'butt' end end describe '#load_hash' do it 'uses #set to load in a hash of properties' do subject.load_hash('stroke' => 'blue', 'fill' => 'green', 'stroke-linecap' => 'Round') expect(subject.stroke).to eq 'blue' expect(subject.fill).to eq 'green' expect(subject.stroke_linecap).to eq 'round' end end describe '#compute_properties' do let(:other) { Prawn::SVG::Properties.new } it 'auto-inherits inheritable properties when the property is not supplied' do subject.set('color', 'green') subject.compute_properties(other) expect(subject.color).to eq 'green' end it "doesn't auto-inherit non-inheritable properties" do subject.set('display', 'none') subject.compute_properties(other) expect(subject.display).to eq 'inline' end it 'inherits non-inheritable properties when specifically asked to' do subject.set('display', 'none') other.set('display', 'inherit') subject.compute_properties(other) expect(subject.display).to eq 'none' end it 'uses the new property value' do subject.set('color', 'green') other.set('color', 'red') subject.compute_properties(other) expect(subject.color).to eq 'red' end describe 'font size' do before do subject.font_size = '15' other.font_size = font_size end context 'when given a % as a font-size' do let(:font_size) { '120%' } it 'calculates the new font size' do subject.compute_properties(other) expect(subject.font_size).to eq '18.0' end end context "when given 'larger' as a font-size" do let(:font_size) { 'larger' } it 'calculates the new font size' do subject.compute_properties(other) expect(subject.font_size).to eq '19.0' end end context "when given 'smaller' as a font-size" do let(:font_size) { 'smaller' } it 'calculates the new font size' do subject.compute_properties(other) expect(subject.font_size).to eq '11.0' end end context "when given a value in 'em' as a font-size" do let(:font_size) { '2.5em' } it 'calculates the new font size' do subject.compute_properties(other) expect(subject.font_size).to eq '37.5' end end context "when given a value in 'rem' as a font-size" do let(:font_size) { '2.5rem' } it 'calculates the new font size' do subject.compute_properties(other) expect(subject.font_size).to eq '40.0' end end context "when given a value in 'px' as a font-size" do let(:font_size) { '19.5px' } it 'uses the font size specified' do subject.compute_properties(other) expect(subject.font_size).to eq '19.5' end end context "when given a value in 'pt' as a font-size" do let(:font_size) { '19.5pt' } it 'uses the font size specified' do subject.compute_properties(other) expect(subject.font_size).to eq '19.5' end end context 'when given a value without units as a font-size' do let(:font_size) { '19.5' } it 'uses the font size specified' do subject.compute_properties(other) expect(subject.font_size).to eq '19.5' end end context "when given the keyword 'inherit' as a font-size" do let(:font_size) { 'inherit' } it 'uses the font size specified by the parent' do subject.compute_properties(other) expect(subject.font_size).to eq '15' end end end end describe '#numerical_font_size' do context 'when the font size is a number' do before { subject.font_size = '16.5' } it 'returns the number as a float' do expect(subject.numerical_font_size).to eq 16.5 end end context 'when the font size is one of the keyword size specifiers' do before { subject.font_size = 'x-large' } it 'returns the font size number corresponding with the keyword' do expect(subject.numerical_font_size).to eq 24 end end end end