require "../spec_helper"

module Ameba
  private def it_tokenizes(str, expected, *, file = __FILE__, line = __LINE__)
    it "tokenizes #{str}", file, line do
      %w[].tap do |token_types|
        Tokenizer.new(Source.new str, normalize: false)
          .run { |token| token_types << token.type.to_s }
          .should be_true
      end.should eq(expected), file: file, line: line
    end
  end

  describe Tokenizer do
    describe "#run" do
      it_tokenizes %("string"), %w(DELIMITER_START STRING DELIMITER_END EOF)
      it_tokenizes %(100), %w(NUMBER EOF)
      it_tokenizes %('a'), %w(CHAR EOF)
      it_tokenizes %([]), %w([] EOF)
      it_tokenizes %([] of String), %w([] SPACE IDENT SPACE CONST EOF)
      it_tokenizes %q("str #{3}"), %w(
        DELIMITER_START STRING INTERPOLATION_START NUMBER } DELIMITER_END EOF
      )

      it_tokenizes %(%w(1 2)),
        %w(STRING_ARRAY_START STRING STRING STRING_ARRAY_END EOF)

      it_tokenizes %(%i(one two)),
        %w(SYMBOL_ARRAY_START STRING STRING STRING_ARRAY_END EOF)

      it_tokenizes %(
          class A
            def method
              puts "hello"
            end
          end
      ), %w(
        NEWLINE SPACE IDENT SPACE CONST NEWLINE SPACE IDENT SPACE IDENT
        NEWLINE SPACE IDENT SPACE DELIMITER_START STRING DELIMITER_END
        NEWLINE SPACE IDENT NEWLINE SPACE IDENT NEWLINE SPACE EOF
      )
    end
  end
end
