2017-11-14 07:24:36 +00:00
|
|
|
require "../spec_helper"
|
|
|
|
|
|
|
|
module Ameba
|
|
|
|
private def runner(files = [__FILE__], formatter = DummyFormatter.new)
|
2017-12-01 17:00:11 +00:00
|
|
|
config = Config.load
|
2017-11-14 07:24:36 +00:00
|
|
|
config.formatter = formatter
|
|
|
|
config.files = files
|
|
|
|
|
2018-02-02 20:11:18 +00:00
|
|
|
config.update_rule ErrorRule.rule_name, enabled: false
|
2017-11-30 21:50:07 +00:00
|
|
|
|
2017-11-14 07:24:36 +00:00
|
|
|
Runner.new(config)
|
|
|
|
end
|
|
|
|
|
|
|
|
describe Runner do
|
|
|
|
formatter = DummyFormatter.new
|
|
|
|
|
|
|
|
describe "#run" do
|
|
|
|
it "returns self" do
|
|
|
|
runner.run.should_not be_nil
|
|
|
|
end
|
|
|
|
|
|
|
|
it "calls started callback" do
|
|
|
|
runner(formatter: formatter).run
|
|
|
|
formatter.started_sources.should_not be_nil
|
|
|
|
end
|
|
|
|
|
|
|
|
it "calls finished callback" do
|
|
|
|
runner(formatter: formatter).run
|
|
|
|
formatter.finished_sources.should_not be_nil
|
|
|
|
end
|
|
|
|
|
|
|
|
it "calls source_started callback" do
|
|
|
|
runner(formatter: formatter).run
|
|
|
|
formatter.started_source.should_not be_nil
|
|
|
|
end
|
|
|
|
|
|
|
|
it "calls source_finished callback" do
|
|
|
|
runner(formatter: formatter).run
|
|
|
|
formatter.finished_source.should_not be_nil
|
|
|
|
end
|
2017-11-30 21:50:07 +00:00
|
|
|
|
|
|
|
it "skips rule check if source is excluded" do
|
|
|
|
path = "source.cr"
|
|
|
|
source = Source.new "", path
|
|
|
|
|
|
|
|
rules = ([] of Rule::Base).tap do |rules|
|
|
|
|
rule = ErrorRule.new
|
|
|
|
rule.excluded = [path]
|
|
|
|
rules << rule
|
|
|
|
end
|
|
|
|
|
|
|
|
Runner.new(rules, [source], formatter).run.success?.should be_true
|
|
|
|
end
|
2018-01-25 09:50:11 +00:00
|
|
|
|
|
|
|
context "invalid syntax" do
|
|
|
|
it "reports a syntax error" do
|
|
|
|
rules = [Rule::Syntax.new] of Rule::Base
|
|
|
|
source = Source.new "def bad_syntax"
|
|
|
|
|
|
|
|
Runner.new(rules, [source], formatter).run
|
|
|
|
source.should_not be_valid
|
2018-02-02 20:11:18 +00:00
|
|
|
source.errors.first.rule.name.should eq Rule::Syntax.rule_name
|
2018-01-25 09:50:11 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
it "does not run other rules" do
|
|
|
|
rules = [Rule::Syntax.new, Rule::ConstantNames.new] of Rule::Base
|
|
|
|
source = Source.new %q(
|
|
|
|
MyBadConstant = 1
|
|
|
|
|
|
|
|
when my_bad_syntax
|
|
|
|
)
|
|
|
|
|
|
|
|
Runner.new(rules, [source], formatter).run
|
|
|
|
source.should_not be_valid
|
|
|
|
source.errors.size.should eq 1
|
|
|
|
end
|
|
|
|
end
|
2018-02-02 20:11:18 +00:00
|
|
|
|
|
|
|
context "unneeded disables" do
|
|
|
|
it "reports an error if such disable exists" do
|
|
|
|
rules = [Rule::UnneededDisableDirective.new] of Rule::Base
|
|
|
|
source = Source.new %(
|
|
|
|
a = 1 # ameba:disable LineLength
|
|
|
|
)
|
|
|
|
|
|
|
|
Runner.new(rules, [source], formatter).run
|
|
|
|
source.should_not be_valid
|
|
|
|
source.errors.first.rule.name.should eq Rule::UnneededDisableDirective.rule_name
|
|
|
|
end
|
|
|
|
end
|
2017-11-14 07:24:36 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
describe "#success?" do
|
|
|
|
it "returns true if runner has not been run" do
|
|
|
|
runner.success?.should be_true
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns true if all sources are valid" do
|
|
|
|
runner.run.success?.should be_true
|
|
|
|
end
|
|
|
|
|
|
|
|
it "returns false if there are invalid sources" do
|
2018-05-22 14:55:44 +00:00
|
|
|
rules = Rule.rules.map &.new.as(Rule::Base)
|
2017-11-14 07:24:36 +00:00
|
|
|
s = Source.new %q(
|
|
|
|
WrongConstant = 5
|
|
|
|
)
|
2017-11-23 17:49:45 +00:00
|
|
|
Runner.new(rules, [s], formatter).run.success?.should be_false
|
2017-11-14 07:24:36 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|