require "../../../spec_helper"

module Ameba::Rule::Lint
  describe PercentArrays do
    subject = PercentArrays.new

    it "passes if percent arrays are written correctly" do
      s = Source.new %q(
        %i(one two three)
        %w(one two three)

        %i(1 2 3)
        %w(1 2 3)

        %i()
        %w()
      )
      subject.catch(s).should be_valid
    end

    it "fails if string percent array has commas" do
      s = Source.new %( %w(one, two) )
      subject.catch(s).should_not be_valid
    end

    it "fails if string percent array has quotes" do
      s = Source.new %( %w("one" "two") )
      subject.catch(s).should_not be_valid
    end

    it "fails if symbols percent array has commas" do
      s = Source.new %( %i(one, two) )
      subject.catch(s).should_not be_valid
    end

    it "fails if symbols percent array has a colon" do
      s = Source.new %( %i(:one :two) )
      subject.catch(s).should_not be_valid
    end

    it "reports rule, location and message for %i" do
      s = Source.new %(
        %i(:one)
      ), "source.cr"

      subject.catch(s).should_not be_valid
      issue = s.issues.first
      issue.rule.should_not be_nil
      issue.location.to_s.should eq "source.cr:1:1"
      issue.message.should eq(
        "Symbols `,:` may be unwanted in %i array literals"
      )
    end

    it "reports rule, location and message for %w" do
      s = Source.new %(
        %w("one")
      ), "source.cr"

      subject.catch(s).should_not be_valid
      issue = s.issues.first
      issue.rule.should_not be_nil
      issue.location.to_s.should eq "source.cr:1:1"
      issue.end_location.should be_nil
      issue.message.should eq(
        "Symbols `,\"` may be unwanted in %w array literals"
      )
    end

    context "properties" do
      it "#string_array_unwanted_symbols" do
        rule = PercentArrays.new
        rule.string_array_unwanted_symbols = ","
        s = Source.new %( %w("one") )
        rule.catch(s).should be_valid
      end

      it "#symbol_array_unwanted_symbols" do
        rule = PercentArrays.new
        rule.symbol_array_unwanted_symbols = ","
        s = Source.new %( %i(:one) )
        rule.catch(s).should be_valid
      end
    end
  end
end
