package org.elixir_lang.elixir_flex_lexer.group.valid_escape_sequence;
import org.elixir_lang.ElixirFlexLexer;
import org.elixir_lang.psi.ElixirTypes;
import org.junit.experimental.theories.DataPoints;
import org.junit.experimental.theories.Theories;
import org.junit.experimental.theories.Theory;
import org.junit.runner.RunWith;
import java.io.IOException;
import java.util.Vector;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* Created by luke.imhoff on 10/13/14.
*/
@RunWith(Theories.class)
public class BracedCharacterCodeTest extends org.elixir_lang.elixir_flex_lexer.Test {
/*
* Methods
*/
private static CharSequence bracedCharacterCode(CharSequence digits) {
return "\\x{" + digits + "}";
}
@DataPoints
public static CharSequence[] dataPoints() {
Vector<CharSequence> charSequences = new Vector<CharSequence>();
// ensure all valid digits are covered for each length
// 6 hexadecimal digits
charSequences.add(bracedCharacterCode("123456"));
charSequences.add(bracedCharacterCode("789012"));
charSequences.add(bracedCharacterCode("ABCDEF"));
charSequences.add(bracedCharacterCode("abcdef"));
// 5 hexadecimal digits
charSequences.add(bracedCharacterCode("12345"));
charSequences.add(bracedCharacterCode("67890"));
charSequences.add(bracedCharacterCode("ABCDE"));
charSequences.add(bracedCharacterCode("FABCD"));
charSequences.add(bracedCharacterCode("abcde"));
charSequences.add(bracedCharacterCode("fabcd"));
// 4 hexadecimal digits
charSequences.add(bracedCharacterCode("1234"));
charSequences.add(bracedCharacterCode("5678"));
charSequences.add(bracedCharacterCode("9012"));
charSequences.add(bracedCharacterCode("ABCD"));
charSequences.add(bracedCharacterCode("EFAB"));
charSequences.add(bracedCharacterCode("abcd"));
charSequences.add(bracedCharacterCode("efab"));
// 3 hexadecimal digits
charSequences.add(bracedCharacterCode("120"));
charSequences.add(bracedCharacterCode("123"));
charSequences.add(bracedCharacterCode("456"));
charSequences.add(bracedCharacterCode("789"));
charSequences.add(bracedCharacterCode("ABC"));
charSequences.add(bracedCharacterCode("DEF"));
charSequences.add(bracedCharacterCode("abc"));
charSequences.add(bracedCharacterCode("def"));
// 2 hexadecimal digits
charSequences.add(bracedCharacterCode("12"));
charSequences.add(bracedCharacterCode("34"));
charSequences.add(bracedCharacterCode("56"));
charSequences.add(bracedCharacterCode("78"));
charSequences.add(bracedCharacterCode("90"));
charSequences.add(bracedCharacterCode("AB"));
charSequences.add(bracedCharacterCode("CD"));
charSequences.add(bracedCharacterCode("EF"));
charSequences.add(bracedCharacterCode("ab"));
charSequences.add(bracedCharacterCode("cd"));
charSequences.add(bracedCharacterCode("ef"));
// 1 hexadecimal digit
charSequences.add(bracedCharacterCode("1"));
charSequences.add(bracedCharacterCode("2"));
charSequences.add(bracedCharacterCode("3"));
charSequences.add(bracedCharacterCode("4"));
charSequences.add(bracedCharacterCode("5"));
charSequences.add(bracedCharacterCode("6"));
charSequences.add(bracedCharacterCode("7"));
charSequences.add(bracedCharacterCode("8"));
charSequences.add(bracedCharacterCode("9"));
charSequences.add(bracedCharacterCode("0"));
return charSequences.toArray(new CharSequence[charSequences.size()]);
};
protected void reset(CharSequence charSequence) throws IOException {
// start of "\"" + promoter to trigger GROUP state
CharSequence fullCharSequence = "\"" + charSequence;
super.reset(fullCharSequence);
// consume "
flexLexer.advance();
}
@Theory
public void validCharacterCode(CharSequence charSequence) throws IOException {
reset(charSequence);
assertEquals(ElixirTypes.ESCAPE, flexLexer.advance());
assertEquals(ElixirFlexLexer.ESCAPE_SEQUENCE, flexLexer.yystate());
assertEquals(ElixirTypes.HEXADECIMAL_WHOLE_NUMBER_BASE, flexLexer.advance());
assertEquals(ElixirFlexLexer.HEXADECIMAL_ESCAPE_SEQUENCE, flexLexer.yystate());
assertEquals(ElixirTypes.OPENING_CURLY, flexLexer.advance());
assertEquals(ElixirFlexLexer.EXTENDED_HEXADECIMAL_ESCAPE_SEQUENCE, flexLexer.yystate());
assertEquals(ElixirTypes.VALID_HEXADECIMAL_DIGITS, flexLexer.advance());
assertEquals(ElixirFlexLexer.EXTENDED_HEXADECIMAL_ESCAPE_SEQUENCE, flexLexer.yystate());
assertEquals(ElixirTypes.CLOSING_CURLY, flexLexer.advance());
assertEquals(ElixirFlexLexer.GROUP, flexLexer.yystate());
assertTrue("Failure: expected all of \"" + charSequence + "\" to be consumed", flexLexer.advance() == null);
};
}