require 'spec_helper' RSpec.describe Prawn::SVG::TransformParser do class Test include Prawn::SVG::Calculators::Pixels include Prawn::SVG::TransformParser State = Struct.new(:viewport_sizing) Properties = Struct.new(:numerical_font_size) Document = Struct.new(:sizing) def document Document.new(_sizing) end def state State.new(_sizing) end def computed_properties Properties.new(14) end def _sizing Prawn::SVG::Calculators::DocumentSizing.new([1000, 800]) end end subject { Test.new.parse_transform_attribute(transform) } context "with no transform" do let(:transform) { '' } it { is_expected.to eq [1, 0, 0, 1, 0, 0] } end context "with translate" do let(:transform) { 'translate(10 20)' } it { is_expected.to eq [1, 0, 0, 1, 10, -20] } end context "with single argument translate" do let(:transform) { 'translate(10)' } it { is_expected.to eq [1, 0, 0, 1, 10, 0] } end context "with translateX" do let(:transform) { 'translateX(10)' } it { is_expected.to eq [1, 0, 0, 1, 10, 0] } end context "with translateY" do let(:transform) { 'translateY(10)' } it { is_expected.to eq [1, 0, 0, 1, 0, -10] } end let(:sin30) { Math.sin(30 * Math::PI / 180.0) } let(:cos30) { Math.cos(30 * Math::PI / 180.0) } let(:tan30) { Math.tan(30 * Math::PI / 180.0) } context "with single argument rotate" do let(:transform) { 'rotate(30)' } it { is_expected.to eq [cos30, -sin30, sin30, cos30, 0, 0] } end context "with triple argument rotate" do let(:transform) { 'rotate(30 100 200)' } it { is_expected.to eq [cos30, -sin30, sin30, cos30, 113.39745962155611, 23.205080756887753] } end context "with scale" do let(:transform) { 'scale(1.5)' } it { is_expected.to eq [1.5, 0, 0, 1.5, 0, 0] } end context "with skewX" do let(:transform) { 'skewX(30)' } it { is_expected.to eq [1, 0, -tan30, 1, 0, 0] } end context "with skewY" do let(:transform) { 'skewY(30)' } it { is_expected.to eq [1, -tan30, 0, 1, 0, 0] } end context "with matrix" do let(:transform) { 'matrix(1 2 3 4 5 6)' } it { is_expected.to eq [1, -2, -3, 4, 5, -6] } end context "with multiple" do let(:transform) { 'scale(2) translate(7) scale(3)' } it { is_expected.to eq [6, 0, 0, 6, 14, 0] } end end