// Path: src/main/java/com/almondtools/rexlex/Lexer.java
// public interface Lexer<T extends Token> {
// 
// 	Iterator<T> lex(String input);
// 
// }
// 
// Path: src/main/java/com/almondtools/rexlex/LexerBuilder.java
// public interface LexerBuilder<T extends Token> {
// 
// 	Lexer<T> build();
// 	void matchRemainder(TokenType type);
// 	void matchPattern(String pattern, TokenType type);
// 
// }
// 
// Path: src/test/java/com/almondtools/rexlex/tokens/Accept.java
// public enum Accept implements TokenType {
// 	A,B,C,D,E,F,G,H,I,J,K,L,REMAINDER;
// 
// 	@Override
// 	public boolean error() {
// 		return false;
// 	}
// 	
// 	@Override
// 	public boolean accept() {
// 		return true;
// 	}
// }
// 
// Path: src/test/java/com/almondtools/rexlex/tokens/TestToken.java
// public class TestToken implements Token {
// 
// 	private String literal;
// 	private TokenType type;
// 
// 	public TestToken(String literal, TokenType type) {
// 		this.literal = literal;
// 		this.type = type;
// 	}
// 	
// 	@Override
// 	public String getLiteral() {
// 		return literal;
// 	}
// 	
// 	@Override
// 	public TokenType getType() {
// 		return type;
// 	}
// 	
// 	@Override
// 	public int hashCode() {
// 		return literal.hashCode() * 31 + type.hashCode();
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		if (this == obj)
// 			return true;
// 		if (obj == null)
// 			return false;
// 		if (getClass() != obj.getClass())
// 			return false;
// 		TestToken other = (TestToken) obj;
// 		return this.type == other.type && this.literal.equals(other.literal);
// 	}
// 	
// 	@Override
// 	public String toString() {
// 		return literal + '(' + type.toString() + ')';
// 	}
// 	
// }
// 
// Path: src/test/java/com/almondtools/rexlex/tokens/TestTokenFactory.java
// public class TestTokenFactory implements TokenFactory<TestToken>{
// 
// 	@Override
// 	public TestToken createToken(String literal, TokenType type) {
// 		return new TestToken(literal, type);
// 	}
// }


import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import org.junit.Before;
import org.junit.Test;
import com.almondtools.rexlex.Lexer;
import com.almondtools.rexlex.LexerBuilder;
import com.almondtools.rexlex.tokens.Accept;
import com.almondtools.rexlex.tokens.TestToken;
import com.almondtools.rexlex.tokens.TestTokenFactory;
package com.almondtools.rexlex.lexer;




public class DynamicLexerBuilderTest {

	private LexerBuilder<TestToken> lexBuilder;
	
	@Before
	public void before() {
		this.lexBuilder = new DynamicLexerBuilder<TestToken>(new TestTokenFactory());
	}
	
	@Test
	public void testAddSingleCharToken() throws Exception {
		lexBuilder.matchPattern("a", Accept.A);
		Lexer<TestToken> lex = lexBuilder.build();
		assertThat(lex.lex("a").next(), equalTo(new TestToken("a", Accept.A)));
		assertFalse(lex.lex("b").hasNext());
	}
	
	@Test
	public void testAddSingleCharTokenAndElse() throws Exception {
// Path: src/main/java/com/almondtools/rexlex/Lexer.java
// public interface Lexer<T extends Token> {
// 
// 	Iterator<T> lex(String input);
// 
// }
// 
// Path: src/main/java/com/almondtools/rexlex/LexerBuilder.java
// public interface LexerBuilder<T extends Token> {
// 
// 	Lexer<T> build();
// 	void matchRemainder(TokenType type);
// 	void matchPattern(String pattern, TokenType type);
// 
// }
// 
// Path: src/test/java/com/almondtools/rexlex/tokens/Accept.java
// public enum Accept implements TokenType {
// 	A,B,C,D,E,F,G,H,I,J,K,L,REMAINDER;
// 
// 	@Override
// 	public boolean error() {
// 		return false;
// 	}
// 	
// 	@Override
// 	public boolean accept() {
// 		return true;
// 	}
// }
// 
// Path: src/test/java/com/almondtools/rexlex/tokens/TestToken.java
// public class TestToken implements Token {
// 
// 	private String literal;
// 	private TokenType type;
// 
// 	public TestToken(String literal, TokenType type) {
// 		this.literal = literal;
// 		this.type = type;
// 	}
// 	
// 	@Override
// 	public String getLiteral() {
// 		return literal;
// 	}
// 	
// 	@Override
// 	public TokenType getType() {
// 		return type;
// 	}
// 	
// 	@Override
// 	public int hashCode() {
// 		return literal.hashCode() * 31 + type.hashCode();
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		if (this == obj)
// 			return true;
// 		if (obj == null)
// 			return false;
// 		if (getClass() != obj.getClass())
// 			return false;
// 		TestToken other = (TestToken) obj;
// 		return this.type == other.type && this.literal.equals(other.literal);
// 	}
// 	
// 	@Override
// 	public String toString() {
// 		return literal + '(' + type.toString() + ')';
// 	}
// 	
// }
// 
// Path: src/test/java/com/almondtools/rexlex/tokens/TestTokenFactory.java
// public class TestTokenFactory implements TokenFactory<TestToken>{
// 
// 	@Override
// 	public TestToken createToken(String literal, TokenType type) {
// 		return new TestToken(literal, type);
// 	}
// }


// Path: src/test/java/com/almondtools/rexlex/lexer/DynamicLexerBuilderTest.java
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import org.junit.Before;
import org.junit.Test;
import com.almondtools.rexlex.Lexer;
import com.almondtools.rexlex.LexerBuilder;
import com.almondtools.rexlex.tokens.Accept;
import com.almondtools.rexlex.tokens.TestToken;
import com.almondtools.rexlex.tokens.TestTokenFactory;

package com.almondtools.rexlex.lexer;




public class DynamicLexerBuilderTest {

	private LexerBuilder<TestToken> lexBuilder;
	
	@Before
	public void before() {
		this.lexBuilder = new DynamicLexerBuilder<TestToken>(new TestTokenFactory());
	}
	
	@Test
	public void testAddSingleCharToken() throws Exception {
		lexBuilder.matchPattern("a", Accept.A);
		Lexer<TestToken> lex = lexBuilder.build();
		assertThat(lex.lex("a").next(), equalTo(new TestToken("a", Accept.A)));
		assertFalse(lex.lex("b").hasNext());
	}
	
	@Test
	public void testAddSingleCharTokenAndElse() throws Exception {
		lexBuilder.matchPattern("a", Accept.A);