spec/public/yardstick/method_spec.rb in dkubb-yardstick-0.0.1 vs spec/public/yardstick/method_spec.rb in dkubb-yardstick-0.1.0

- old
+ new

@@ -1,6 +1,356 @@ require 'pathname' require Pathname(__FILE__).dirname.expand_path.join('..', '..', 'spec_helper') +shared_examples_for 'method is measured' do + before do + @measurements = docstring.measure + end + + it 'should return a MeasurementSet' do + @measurements.should be_kind_of(Yardstick::MeasurementSet) + end +end + +shared_examples_for 'a valid method' do + before do + YARD.parse_string(<<-RUBY) + # This is a method summary that is the maximum --- exactly 80 characters in length + # + # @example + # test('Hello World') # => nil + # + # @param [#to_str] value + # the value + # + # @return [nil] + # returns nil + # + # @api public + def test(value) + end + RUBY + end +end + describe Yardstick::Method do - it 'should be awesome' + def docstring + YARD::Registry.all(:method).first.docstring + end + + describe '#measure' do + describe 'with a method summary' do + it_should_behave_like 'a valid method' + it_should_behave_like 'method is measured' + + it 'should have a correct measurement' do + @measurements.detect { |measurement| measurement.description == 'The method summary should be specified' }.should be_ok + end + end + + describe 'without a method summary' do + before do + YARD.parse_string('def test(value); end') + end + + it_should_behave_like 'method is measured' + + it 'should have an incorrect measurement' do + @measurements.detect { |measurement| measurement.description == 'The method summary should be specified' }.should_not be_ok + end + end + + describe 'with a method summary that is 80 characters in length' do + it_should_behave_like 'a valid method' + it_should_behave_like 'method is measured' + + it 'should have a correct measurement' do + @measurements.detect { |measurement| measurement.description == 'The method summary should be less than 80 characters in length' }.should be_ok + end + end + + describe 'with a method summary that is 81 characters in length' do + before do + YARD.parse_string(<<-RUBY) + # This is a method summary greater than the maximum - it is 81 characters in length + def test(value) + end + RUBY + end + + it_should_behave_like 'method is measured' + + it 'should have an incorrect measurement' do + @measurements.detect { |measurement| measurement.description == 'The method summary should be less than 80 characters in length' }.should_not be_ok + end + end + + describe 'with a method summary that does not end in a period' do + it_should_behave_like 'a valid method' + it_should_behave_like 'method is measured' + + it 'should have a correct measurement' do + @measurements.detect { |measurement| measurement.description == 'The method summary should not end in a period' }.should be_ok + end + end + + describe 'with a method summary that does end in a period' do + before do + YARD.parse_string(<<-RUBY) + # This method summary ends in a period. + def test(value) + end + RUBY + end + + it_should_behave_like 'method is measured' + + it 'should have an incorrect measurement' do + @measurements.detect { |measurement| measurement.description == 'The method summary should not end in a period' }.should_not be_ok + end + end + + describe 'with a method summary that is on one line' do + it_should_behave_like 'a valid method' + it_should_behave_like 'method is measured' + + it 'should have a correct measurement' do + @measurements.detect { |measurement| measurement.description == 'The method summary should be a single line' }.should be_ok + end + end + + describe 'with a method summary that is not on one line' do + before do + YARD.parse_string(<<-RUBY) + # This method summary + # is on two lines + def test(value) + end + RUBY + end + + it_should_behave_like 'method is measured' + + it 'should have an incorrect measurement' do + @measurements.detect { |measurement| measurement.description == 'The method summary should be a single line' }.should_not be_ok + end + end + + describe 'with a method that has an @example tag' do + it_should_behave_like 'a valid method' + it_should_behave_like 'method is measured' + + it 'should have a correct measurement' do + @measurements.detect { |measurement| measurement.description == 'The public/semipublic method should have an example specified' }.should be_ok + end + end + + describe 'with a method that is private' do + before do + YARD.parse_string(<<-RUBY) + # @api private + def test(value) + end + RUBY + end + + it_should_behave_like 'method is measured' + + it 'should be skipped' do + @measurements.detect { |measurement| measurement.description == 'The public/semipublic method should have an example specified' }.should be_skip + end + end + + describe 'with a method that does not have an @example tag, and has an undefined @return tag' do + before do + YARD.parse_string(<<-RUBY) + # @return [undefined] + # + # @api public + def test(value) + end + RUBY + end + + it_should_behave_like 'method is measured' + + it 'should be skipped' do + @measurements.detect { |measurement| measurement.description == 'The public/semipublic method should have an example specified' }.should be_skip + end + end + + describe 'with a method that has an @api tag' do + it_should_behave_like 'a valid method' + it_should_behave_like 'method is measured' + + it 'should have a correct measurement' do + @measurements.detect { |measurement| measurement.description == 'The @api tag should be specified' }.should be_ok + end + end + + describe 'with a method that does not have an @api tag' do + before do + YARD.parse_string('def test(value); end') + end + + it_should_behave_like 'method is measured' + + it 'should have an incorrect measurement' do + @measurements.detect { |measurement| measurement.description == 'The @api tag should be specified' }.should_not be_ok + end + end + + describe 'with a method that has a public @api tag' do + it_should_behave_like 'a valid method' + it_should_behave_like 'method is measured' + + it 'should have a correct measurement' do + @measurements.detect { |measurement| measurement.description == 'The @api tag must be either public, semipublic or private' }.should be_ok + end + end + + describe 'with a method that has an invalid @api tag' do + before do + YARD.parse_string(<<-RUBY) + # @api invalid + def test(value) + end + RUBY + end + + it_should_behave_like 'method is measured' + + it 'should have an incorrect measurement' do + @measurements.detect { |measurement| measurement.description == 'The @api tag must be either public, semipublic or private' }.should_not be_ok + end + end + + describe 'with a protected method and a semipublic @api tag' do + before do + YARD.parse_string(<<-RUBY) + protected + + # @api semipublic + def test(value) + end + RUBY + end + + it_should_behave_like 'method is measured' + + it 'should have a correct measurement' do + @measurements.detect { |measurement| measurement.description == 'A method with protected visibility must have an @api tag of semipublic or private' }.should be_ok + end + end + + describe 'with a protected method and a private @api tag' do + before do + YARD.parse_string(<<-RUBY) + protected + + # @api private + def test(value) + end + RUBY + end + + it_should_behave_like 'method is measured' + + it 'should have a correct measurement' do + @measurements.detect { |measurement| measurement.description == 'A method with protected visibility must have an @api tag of semipublic or private' }.should be_ok + end + end + + describe 'with a protected method and a public @api tag' do + before do + YARD.parse_string(<<-RUBY) + protected + + # @api public + def test(value) + end + RUBY + end + + it_should_behave_like 'method is measured' + + it 'should have an incorrect measurement' do + @measurements.detect { |measurement| measurement.description == 'A method with protected visibility must have an @api tag of semipublic or private' }.should_not be_ok + end + end + + describe 'with a private method and a private @api tag' do + before do + YARD.parse_string(<<-RUBY) + private + + # @api private + def test(value) + end + RUBY + end + + it_should_behave_like 'method is measured' + + it 'should have a correct measurement' do + @measurements.detect { |measurement| measurement.description == 'A method with private visibility must have an @api tag of private' }.should be_ok + end + end + + describe 'with a private method and a public @api tag' do + before do + YARD.parse_string(<<-RUBY) + private + + # @api public + def test(value) + end + RUBY + end + + it_should_behave_like 'method is measured' + + it 'should have an incorrect measurement' do + @measurements.detect { |measurement| measurement.description == 'A method with private visibility must have an @api tag of private' }.should_not be_ok + end + end + + describe 'with a private method and a semipublic @api tag' do + before do + YARD.parse_string(<<-RUBY) + private + + # @api semipublic + def test(value) + end + RUBY + end + + it_should_behave_like 'method is measured' + + it 'should have an incorrect measurement' do + @measurements.detect { |measurement| measurement.description == 'A method with private visibility must have an @api tag of private' }.should_not be_ok + end + end + + describe 'with a method that has a @return tag' do + it_should_behave_like 'a valid method' + it_should_behave_like 'method is measured' + + it 'should have a correct measurement' do + @measurements.detect { |measurement| measurement.description == 'The @return tag should be specified' }.should be_ok + end + end + + describe 'with a method that does not have a @return tag' do + before do + YARD.parse_string('def test(value); end') + end + + it_should_behave_like 'method is measured' + + it 'should have an incorrect measurement' do + @measurements.detect { |measurement| measurement.description == 'The @return tag should be specified' }.should_not be_ok + end + end + end end