package org.elixir_lang.elixir_flex_lexer; import com.intellij.psi.TokenType; import org.elixir_lang.ElixirFlexLexer; import org.elixir_lang.TokenTypeState; import org.elixir_lang.psi.ElixirTypes; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import java.io.IOException; import java.util.Arrays; import java.util.Collection; import java.util.List; import static org.junit.Assert.assertEquals; /** * See https://github.com/KronicDeth/intellij-elixir/issues/196 */ @RunWith(Parameterized.class) public class SigilPromoterTest extends Test { /* * Fields */ private CharSequence identifierCharSequence; private List<TokenTypeState> tokenTypeStates; /* * Constructors */ public SigilPromoterTest(CharSequence identifierCharSequence, List<TokenTypeState> tokenTypeStates) { this.identifierCharSequence = identifierCharSequence; this.tokenTypeStates = tokenTypeStates; } /* * Static Methods */ @Parameterized.Parameters( name = "\"{0}\" parses" ) public static Collection<Object[]> generateData() { return Arrays.asList(new Object[][]{ { "def f () do\nend", Arrays.asList( new TokenTypeState(ElixirTypes.IDENTIFIER_TOKEN, ElixirFlexLexer.CALL_OR_KEYWORD_PAIR_MAYBE), new TokenTypeState(TokenType.WHITE_SPACE, ElixirFlexLexer.YYINITIAL), new TokenTypeState(ElixirTypes.IDENTIFIER_TOKEN, ElixirFlexLexer.CALL_OR_KEYWORD_PAIR_MAYBE), new TokenTypeState(TokenType.WHITE_SPACE, ElixirFlexLexer.YYINITIAL), new TokenTypeState(ElixirTypes.OPENING_PARENTHESIS, ElixirFlexLexer.YYINITIAL), new TokenTypeState(ElixirTypes.CLOSING_PARENTHESIS, ElixirFlexLexer.YYINITIAL), new TokenTypeState(TokenType.WHITE_SPACE, ElixirFlexLexer.YYINITIAL), new TokenTypeState(ElixirTypes.DO, ElixirFlexLexer.KEYWORD_PAIR_MAYBE), new TokenTypeState(ElixirTypes.EOL, ElixirFlexLexer.YYINITIAL), new TokenTypeState(ElixirTypes.END, ElixirFlexLexer.KEYWORD_PAIR_MAYBE) ) }, { "def f (~) do\nend", Arrays.asList( new TokenTypeState(ElixirTypes.IDENTIFIER_TOKEN, ElixirFlexLexer.CALL_OR_KEYWORD_PAIR_MAYBE), new TokenTypeState(TokenType.WHITE_SPACE, ElixirFlexLexer.YYINITIAL), new TokenTypeState(ElixirTypes.IDENTIFIER_TOKEN, ElixirFlexLexer.CALL_OR_KEYWORD_PAIR_MAYBE), new TokenTypeState(TokenType.WHITE_SPACE, ElixirFlexLexer.YYINITIAL), new TokenTypeState(ElixirTypes.OPENING_PARENTHESIS, ElixirFlexLexer.YYINITIAL), new TokenTypeState(ElixirTypes.TILDE, ElixirFlexLexer.SIGIL), new TokenTypeState(TokenType.BAD_CHARACTER, ElixirFlexLexer.SIGIL), // ) new TokenTypeState(TokenType.BAD_CHARACTER, ElixirFlexLexer.SIGIL), // space new TokenTypeState(ElixirTypes.INTERPOLATING_SIGIL_NAME, ElixirFlexLexer.NAMED_SIGIL), // d new TokenTypeState(TokenType.BAD_CHARACTER, ElixirFlexLexer.NAMED_SIGIL), // o new TokenTypeState(TokenType.BAD_CHARACTER, ElixirFlexLexer.NAMED_SIGIL), // \n new TokenTypeState(TokenType.BAD_CHARACTER, ElixirFlexLexer.NAMED_SIGIL), // e new TokenTypeState(TokenType.BAD_CHARACTER, ElixirFlexLexer.NAMED_SIGIL), // n new TokenTypeState(TokenType.BAD_CHARACTER, ElixirFlexLexer.NAMED_SIGIL) // d ) } } ); } /* * Instance Methods */ @org.junit.Test public void sigilPromoter() throws IOException { reset(identifierCharSequence); for (TokenTypeState tokenTypeState: tokenTypeStates) { assertEquals(tokenTypeState.tokenType, flexLexer.advance()); assertEquals(tokenTypeState.state, flexLexer.yystate()); } assert flexLexer.advance() == null; } @Override protected void reset(CharSequence charSequence) throws IOException { CharSequence fullCharSequence = charSequence; super.reset(fullCharSequence); } }