require "../../spec_helper" require "../../../src/ameba/cli/cmd" module Ameba::Cli describe "Cmd" do describe ".run" do it "runs ameba" do r = Cli.run %w(-f silent -c spec/fixtures/config.yml spec/fixtures/source.cr) r.should be_nil end end describe ".parse_args" do %w(-s --silent).each do |flag| it "accepts #{flag} flag" do c = Cli.parse_args [flag] c.formatter.should eq :silent end end %w(-c --config).each do |flag| it "accepts #{flag} flag" do c = Cli.parse_args [flag, "config.yml"] c.config.should eq Path["config.yml"] end end %w(-f --format).each do |flag| it "accepts #{flag} flag" do c = Cli.parse_args [flag, "my-formatter"] c.formatter.should eq "my-formatter" end end it "accepts --only flag" do c = Cli.parse_args ["--only", "RULE1,RULE2"] c.only.should eq %w(RULE1 RULE2) end it "accepts --except flag" do c = Cli.parse_args ["--except", "RULE1,RULE2"] c.except.should eq %w(RULE1 RULE2) end it "defaults rules? flag to false" do c = Cli.parse_args %w(spec/fixtures/source.cr) c.rules?.should be_false end it "defaults skip_reading_config? flag to false" do c = Cli.parse_args %w(spec/fixtures/source.cr) c.skip_reading_config?.should be_false end it "accepts --rules flag" do c = Cli.parse_args %w(--rules) c.rules?.should eq true end it "defaults all? flag to false" do c = Cli.parse_args %w(spec/fixtures/source.cr) c.all?.should be_false end it "accepts --all flag" do c = Cli.parse_args %w(--all) c.all?.should eq true end it "accepts --gen-config flag" do c = Cli.parse_args %w(--gen-config) c.formatter.should eq :todo end it "accepts --no-color flag" do c = Cli.parse_args %w(--no-color) c.colors?.should be_false end it "accepts --without-affected-code flag" do c = Cli.parse_args %w(--without-affected-code) c.without_affected_code?.should be_true end it "doesn't disable colors by default" do c = Cli.parse_args %w(--all) c.colors?.should be_true end it "ignores --config if --gen-config flag passed" do c = Cli.parse_args %w(--gen-config --config my_config.yml) c.formatter.should eq :todo c.skip_reading_config?.should be_true end describe "-e/--explain" do it "configures file/line/column" do c = Cli.parse_args %w(--explain spec/fixtures/source.cr:3:5) location_to_explain = c.location_to_explain.should_not be_nil location_to_explain[:file].should eq "spec/fixtures/source.cr" location_to_explain[:line].should eq 3 location_to_explain[:column].should eq 5 end it "raises an error if location is not valid" do expect_raises(Exception, "location should have PATH:line:column") do Cli.parse_args %w(--explain spec/fixtures/source.cr:3) end end it "raises an error if line number is not valid" do expect_raises(Exception, "location should have PATH:line:column") do Cli.parse_args %w(--explain spec/fixtures/source.cr:a:3) end end it "raises an error if column number is not valid" do expect_raises(Exception, "location should have PATH:line:column") do Cli.parse_args %w(--explain spec/fixtures/source.cr:3:&) end end it "raises an error if line/column are missing" do expect_raises(Exception, "location should have PATH:line:column") do Cli.parse_args %w(--explain spec/fixtures/source.cr) end end end context "--fail-level" do it "configures fail level Convention" do c = Cli.parse_args %w(--fail-level convention) c.fail_level.should eq Severity::Convention end it "configures fail level Warning" do c = Cli.parse_args %w(--fail-level Warning) c.fail_level.should eq Severity::Warning end it "configures fail level Error" do c = Cli.parse_args %w(--fail-level error) c.fail_level.should eq Severity::Error end it "raises if fail level is incorrect" do expect_raises(Exception, "Incorrect severity name JohnDoe") do Cli.parse_args %w(--fail-level JohnDoe) end end end it "accepts unknown args as globs" do c = Cli.parse_args %w(source1.cr source2.cr) c.globs.should eq %w(source1.cr source2.cr) end it "accepts one unknown arg as explain location if it has correct format" do c = Cli.parse_args %w(source.cr:3:22) location_to_explain = c.location_to_explain.should_not be_nil location_to_explain[:file].should eq "source.cr" location_to_explain[:line].should eq 3 location_to_explain[:column].should eq 22 end it "allows args to be blank" do c = Cli.parse_args [] of String c.formatter.should be_nil c.globs.should be_nil c.only.should be_nil c.except.should be_nil c.config.should be_nil end end end end