2017-03-08 13:51:35 +05:30
|
|
|
require "rubocop"
|
|
|
|
require "rubocop/rspec/support"
|
|
|
|
require_relative "../../extend/string"
|
|
|
|
require_relative "../../rubocops/formula_desc_cop"
|
|
|
|
|
2017-06-08 15:13:06 +03:00
|
|
|
describe RuboCop::Cop::FormulaAuditStrict::DescLength do
|
2017-03-08 13:51:35 +05:30
|
|
|
subject(:cop) { described_class.new }
|
|
|
|
|
|
|
|
context "When auditing formula desc" do
|
|
|
|
it "When there is no desc" do
|
2017-10-15 02:28:32 +02:00
|
|
|
source = <<~EOS
|
2017-03-08 13:51:35 +05:30
|
|
|
class Foo < Formula
|
|
|
|
url 'http://example.com/foo-1.0.tgz'
|
|
|
|
end
|
|
|
|
EOS
|
|
|
|
|
|
|
|
expected_offenses = [{ message: "Formula should have a desc (Description).",
|
|
|
|
severity: :convention,
|
|
|
|
line: 1,
|
|
|
|
column: 0,
|
|
|
|
source: source }]
|
|
|
|
|
2017-10-07 22:31:23 +02:00
|
|
|
inspect_source(source)
|
2017-03-08 13:51:35 +05:30
|
|
|
|
|
|
|
expected_offenses.zip(cop.offenses).each do |expected, actual|
|
|
|
|
expect_offense(expected, actual)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-10-10 15:43:07 +01:00
|
|
|
it "reports an offense when desc is an empty string" do
|
2017-10-15 02:28:32 +02:00
|
|
|
source = <<~EOS
|
2017-10-10 15:43:07 +01:00
|
|
|
class Foo < Formula
|
|
|
|
url 'http://example.com/foo-1.0.tgz'
|
|
|
|
desc ''
|
|
|
|
end
|
|
|
|
EOS
|
|
|
|
|
|
|
|
msg = "The desc (description) should not be an empty string."
|
|
|
|
expected_offenses = [{ message: msg,
|
|
|
|
severity: :convention,
|
|
|
|
line: 3,
|
|
|
|
column: 2,
|
|
|
|
source: source }]
|
|
|
|
|
|
|
|
inspect_source(source, "/homebrew-core/Formula/foo.rb")
|
|
|
|
expected_offenses.zip(cop.offenses).each do |expected, actual|
|
|
|
|
expect_offense(expected, actual)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-03-08 13:51:35 +05:30
|
|
|
it "When desc is too long" do
|
2017-10-15 02:28:32 +02:00
|
|
|
source = <<~EOS
|
2017-03-08 13:51:35 +05:30
|
|
|
class Foo < Formula
|
|
|
|
url 'http://example.com/foo-1.0.tgz'
|
2017-06-08 15:13:06 +03:00
|
|
|
desc 'Bar#{"bar" * 29}'
|
2017-03-08 13:51:35 +05:30
|
|
|
end
|
|
|
|
EOS
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
msg = <<~EOS
|
2017-03-08 13:51:35 +05:30
|
|
|
Description is too long. "name: desc" should be less than 80 characters.
|
2017-08-30 15:48:41 +05:30
|
|
|
Length is calculated as foo + desc. (currently 95)
|
2017-03-08 13:51:35 +05:30
|
|
|
EOS
|
|
|
|
expected_offenses = [{ message: msg,
|
|
|
|
severity: :convention,
|
|
|
|
line: 3,
|
2017-03-16 23:49:43 +05:30
|
|
|
column: 2,
|
2017-03-08 13:51:35 +05:30
|
|
|
source: source }]
|
|
|
|
|
2017-10-07 22:31:23 +02:00
|
|
|
inspect_source(source, "/homebrew-core/Formula/foo.rb")
|
2017-03-08 13:51:35 +05:30
|
|
|
expected_offenses.zip(cop.offenses).each do |expected, actual|
|
|
|
|
expect_offense(expected, actual)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-05-13 18:44:37 +05:30
|
|
|
it "When desc is multiline string" do
|
2017-10-15 02:28:32 +02:00
|
|
|
source = <<~EOS
|
2017-05-13 18:44:37 +05:30
|
|
|
class Foo < Formula
|
|
|
|
url 'http://example.com/foo-1.0.tgz'
|
2017-06-08 15:13:06 +03:00
|
|
|
desc 'Bar#{"bar" * 9}'\
|
2017-06-01 16:06:51 +02:00
|
|
|
'#{"foo" * 21}'
|
2017-05-13 18:44:37 +05:30
|
|
|
end
|
|
|
|
EOS
|
|
|
|
|
2017-10-15 02:28:32 +02:00
|
|
|
msg = <<~EOS
|
2017-05-13 18:44:37 +05:30
|
|
|
Description is too long. "name: desc" should be less than 80 characters.
|
2017-08-30 15:48:41 +05:30
|
|
|
Length is calculated as foo + desc. (currently 98)
|
2017-05-13 18:44:37 +05:30
|
|
|
EOS
|
|
|
|
expected_offenses = [{ message: msg,
|
|
|
|
severity: :convention,
|
|
|
|
line: 3,
|
|
|
|
column: 2,
|
|
|
|
source: source }]
|
|
|
|
|
2017-10-07 22:31:23 +02:00
|
|
|
inspect_source(source, "/homebrew-core/Formula/foo.rb")
|
2017-05-13 18:44:37 +05:30
|
|
|
expected_offenses.zip(cop.offenses).each do |expected, actual|
|
|
|
|
expect_offense(expected, actual)
|
|
|
|
end
|
|
|
|
end
|
2017-06-08 15:13:06 +03:00
|
|
|
end
|
|
|
|
end
|
2017-05-13 18:44:37 +05:30
|
|
|
|
2017-06-08 15:13:06 +03:00
|
|
|
describe RuboCop::Cop::FormulaAuditStrict::Desc do
|
|
|
|
subject(:cop) { described_class.new }
|
|
|
|
|
|
|
|
context "When auditing formula desc" do
|
2017-03-08 13:51:35 +05:30
|
|
|
it "When wrong \"command-line\" usage in desc" do
|
2017-10-15 02:28:32 +02:00
|
|
|
source = <<~EOS
|
2017-03-08 13:51:35 +05:30
|
|
|
class Foo < Formula
|
|
|
|
url 'http://example.com/foo-1.0.tgz'
|
|
|
|
desc 'command line'
|
|
|
|
end
|
|
|
|
EOS
|
|
|
|
|
|
|
|
expected_offenses = [{ message: "Description should use \"command-line\" instead of \"command line\"",
|
|
|
|
severity: :convention,
|
|
|
|
line: 3,
|
|
|
|
column: 8,
|
|
|
|
source: source }]
|
|
|
|
|
2017-10-07 22:31:23 +02:00
|
|
|
inspect_source(source)
|
2017-03-08 13:51:35 +05:30
|
|
|
expected_offenses.zip(cop.offenses).each do |expected, actual|
|
|
|
|
expect_offense(expected, actual)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it "When an article is used in desc" do
|
2017-10-15 02:28:32 +02:00
|
|
|
source = <<~EOS
|
2017-03-08 13:51:35 +05:30
|
|
|
class Foo < Formula
|
|
|
|
url 'http://example.com/foo-1.0.tgz'
|
|
|
|
desc 'An '
|
|
|
|
end
|
|
|
|
EOS
|
|
|
|
|
2017-06-08 15:13:06 +03:00
|
|
|
expected_offenses = [{ message: "Description shouldn't start with an indefinite article i.e. \"An\"",
|
|
|
|
severity: :convention,
|
|
|
|
line: 3,
|
|
|
|
column: 8,
|
|
|
|
source: source }]
|
|
|
|
|
2017-10-07 22:31:23 +02:00
|
|
|
inspect_source(source)
|
2017-06-08 15:13:06 +03:00
|
|
|
expected_offenses.zip(cop.offenses).each do |expected, actual|
|
|
|
|
expect_offense(expected, actual)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it "When an lowercase letter starts a desc" do
|
2017-10-15 02:28:32 +02:00
|
|
|
source = <<~EOS
|
2017-06-08 15:13:06 +03:00
|
|
|
class Foo < Formula
|
|
|
|
url 'http://example.com/foo-1.0.tgz'
|
|
|
|
desc 'bar'
|
|
|
|
end
|
|
|
|
EOS
|
|
|
|
|
|
|
|
expected_offenses = [{ message: "Description should start with a capital letter",
|
2017-03-08 13:51:35 +05:30
|
|
|
severity: :convention,
|
|
|
|
line: 3,
|
|
|
|
column: 8,
|
|
|
|
source: source }]
|
|
|
|
|
2017-10-07 22:31:23 +02:00
|
|
|
inspect_source(source)
|
2017-03-08 13:51:35 +05:30
|
|
|
expected_offenses.zip(cop.offenses).each do |expected, actual|
|
|
|
|
expect_offense(expected, actual)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it "When formula name is in desc" do
|
2017-10-15 02:28:32 +02:00
|
|
|
source = <<~EOS
|
2017-03-08 13:51:35 +05:30
|
|
|
class Foo < Formula
|
|
|
|
url 'http://example.com/foo-1.0.tgz'
|
2017-06-29 08:14:58 -07:00
|
|
|
desc 'Foo is a foobar'
|
2017-03-08 13:51:35 +05:30
|
|
|
end
|
|
|
|
EOS
|
|
|
|
|
2017-06-29 08:14:58 -07:00
|
|
|
expected_offenses = [{ message: "Description shouldn't start with the formula name",
|
2017-03-08 13:51:35 +05:30
|
|
|
severity: :convention,
|
|
|
|
line: 3,
|
|
|
|
column: 8,
|
|
|
|
source: source }]
|
|
|
|
|
2017-10-07 22:31:23 +02:00
|
|
|
inspect_source(source, "/homebrew-core/Formula/foo.rb")
|
2017-03-08 13:51:35 +05:30
|
|
|
expected_offenses.zip(cop.offenses).each do |expected, actual|
|
|
|
|
expect_offense(expected, actual)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-06-08 15:13:06 +03:00
|
|
|
it "autocorrects all rules" do
|
2017-10-15 02:28:32 +02:00
|
|
|
source = <<~EOS
|
2017-06-08 15:13:06 +03:00
|
|
|
class Foo < Formula
|
|
|
|
url 'http://example.com/foo-1.0.tgz'
|
|
|
|
desc ' an bar: commandline foo '
|
|
|
|
end
|
|
|
|
EOS
|
2017-10-15 02:28:32 +02:00
|
|
|
correct_source = <<~EOS
|
2017-06-08 15:13:06 +03:00
|
|
|
class Foo < Formula
|
|
|
|
url 'http://example.com/foo-1.0.tgz'
|
|
|
|
desc 'an bar: command-line'
|
|
|
|
end
|
|
|
|
EOS
|
|
|
|
|
2017-10-07 22:31:23 +02:00
|
|
|
corrected_source = autocorrect_source(source, "/homebrew-core/Formula/foo.rb")
|
2017-06-08 15:13:06 +03:00
|
|
|
expect(corrected_source).to eq(correct_source)
|
2017-03-08 13:51:35 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|