shared_examples_for "star DSL method" do it "creates a Shoes::Star" do expect(dsl.star(30, 20)).to be_an_instance_of(Shoes::Star) end it "raises an ArgumentError with just one argument" do expect { dsl.star(30) }.to raise_error(ArgumentError) end describe 'instantiation' do let(:left) { 10 } let(:top) { 20 } let(:points) { 15 } let(:outer) { 27 } let(:inner) { 33 } let(:clickable) { proc {} } DEFAULT_POINTS = 10 DEFAULT_OUTER = 100.0 DEFAULT_INNER = 50.0 describe '2 arguments' do subject { dsl.star left, top } its(:left) { should eq left } its(:top) { should eq top } its(:points) { should eq DEFAULT_POINTS } its(:outer) { should eq DEFAULT_OUTER } its(:inner) { should eq DEFAULT_INNER } end describe '2 arguments with hash' do subject { dsl.star left, top, click: clickable } its(:left) { should eq left } its(:top) { should eq top } its(:points) { should eq DEFAULT_POINTS } its(:outer) { should eq DEFAULT_OUTER } its(:inner) { should eq DEFAULT_INNER } it "gets the click" do expect(subject.style[:click]).to eq(clickable) end end describe '3 arguments with hash' do subject { dsl.star left, top, points, click: clickable } its(:left) { should eq left } its(:top) { should eq top } its(:points) { should eq points } its(:outer) { should eq DEFAULT_OUTER } its(:inner) { should eq DEFAULT_INNER } it "gets the click" do expect(subject.style[:click]).to eq(clickable) end end describe '4 arguments' do subject { dsl.star left, top, points, outer } its(:left) { should eq left } its(:top) { should eq top } its(:points) { should eq points } its(:outer) { should eq outer } its(:inner) { should eq DEFAULT_INNER } end describe '4 arguments with hash' do subject { dsl.star left, top, points, outer, click: clickable } its(:left) { should eq left } its(:top) { should eq top } its(:points) { should eq points } its(:outer) { should eq outer } its(:inner) { should eq DEFAULT_INNER } it "gets the click" do expect(subject.style[:click]).to eq(clickable) end end describe '5 arguments' do subject { dsl.star left, top, points, outer, inner } its(:left) { should eq left } its(:top) { should eq top } its(:points) { should eq points } its(:outer) { should eq outer } its(:inner) { should eq inner } end describe '5 arguments with hash' do subject { dsl.star left, top, points, outer, inner, click: clickable } its(:left) { should eq left } its(:top) { should eq top } its(:points) { should eq points } its(:outer) { should eq outer } its(:inner) { should eq inner } it "gets the click" do expect(subject.style[:click]).to eq(clickable) end end describe 'too many arguments' do oops = 1000 subject { dsl.star left, top, points, outer, inner, oops } it "raises on construction" do expect { subject }.to raise_error(ArgumentError) end end end end