package net.bitpot.railways.parser.route;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import static org.junit.Assert.assertEquals;
/**
* Test of parsing route into tokens for syntax highlighting.
*/
@RunWith(Parameterized.class)
public class RoutePathParseTest
{
private String myRouteStr;
private RoutePathChunk[] expectedTokens;
public RoutePathParseTest(String routeStr, RoutePathChunk[] tokens) {
myRouteStr = routeStr;
expectedTokens = tokens;
}
@Parameterized.Parameters
public static Collection<Object[]> createParseLineData() {
return Arrays.asList(new Object[][] {
{ "/users", new RoutePathChunk[] {
chunk_plain("/users")
}
},
{ "/users/:id", new RoutePathChunk[] {
chunk_plain("/users/"), chunk_param(":id")
}
},
{ "/users/:id/edit", new RoutePathChunk[] {
chunk_plain("/users/"), chunk_param(":id"), chunk_plain("/edit"),
}
},
{ "/users(/list)", new RoutePathChunk[] {
chunk_plain("/users"), chunk_optional("(/list)")
}
},
{ "/users(.:format)", new RoutePathChunk[] {
chunk_plain("/users"), chunk_optional("(.:format)")
}
},
{ "/users(/list(/recent))", new RoutePathChunk[] {
chunk_plain("/users"), chunk_optional("(/list(/recent))")
}
},
// Unbalanced (invalid) route should also be correctly parsed,
// but all tokens should be PLAIN
{ "/users(/list(/recent)", new RoutePathChunk[] {
chunk_plain("/users"), chunk_plain("(/list(/recent)")
}
}
});
}
private static RoutePathChunk chunk_plain(String text) {
return new RoutePathChunk(text, RoutePathChunk.PLAIN, 0);
}
private static RoutePathChunk chunk_param(String text) {
return new RoutePathChunk(text, RoutePathChunk.PARAMETER, 0);
}
private static RoutePathChunk chunk_optional(String text) {
return new RoutePathChunk(text, RoutePathChunk.OPTIONAL, 0);
}
@Test
public void testParseRoute() {
List<TextChunk> tokens = RoutePathParser.getInstance().parse(myRouteStr);
assertEquals("Token lists have the same length",
expectedTokens.length, tokens.size());
for(int i = 0; i < tokens.size(); i++) {
TextChunk expectedToken = expectedTokens[i];
TextChunk token = tokens.get(i);
assertEquals("Token types are the same",
expectedToken.getType(), token.getType());
assertEquals("Token text are the same",
expectedToken.getText(), token.getText());
}
}
}