package net.bitpot.railways.parser.route; import org.junit.Test; import java.util.ArrayList; import java.util.Collections; import java.util.List; import static org.junit.Assert.assertEquals; /** * Test of route parser. */ public class TextChunkHighlightTest { private List<TextChunk> parsePathAndHighlight(String subject, String hlStr) { RoutePathParser parser = RoutePathParser.getInstance(); return parser.highlight(parser.parse(subject), hlStr); } private List<TextChunk> parseActionAndHighlight(String subject, String hlStr) { RouteActionParser parser = RouteActionParser.getInstance(); return parser.highlight(parser.parse(subject), hlStr); } private List<TextChunk> createChunkList(TextChunk... chunks) { ArrayList<TextChunk> result = new ArrayList<TextChunk>(); Collections.addAll(result, chunks); return result; } @Test public void testParseAndHighlight() { List<TextChunk> actual = parsePathAndHighlight("/test(.:test)", "st"); List<TextChunk> expected = createChunkList( chunkPlain("/te", false), chunkPlain("st", true), chunkOptional("(.:te", false), chunkOptional("st", true), chunkOptional(")", false) ); assertChunkListEqual(expected, actual); } @Test public void testParseAndHighlightWhenOneTokenHasNoHighlightedText() { List<TextChunk> actual = parsePathAndHighlight("/tasks/:id", "t"); List<TextChunk> expected = createChunkList( chunkPlain("/", false), chunkPlain("t", true), chunkPlain("asks/", false), chunkParam(":id", false) ); assertChunkListEqual(expected, actual); } @Test public void testParseAndHighlightMultipleRegionsInOneChunk() { List<TextChunk> actual = parsePathAndHighlight("/test/test", "es"); List<TextChunk> expected = createChunkList( chunkPlain("/t", false), chunkPlain("es", true), chunkPlain("t/t", false), chunkPlain("es", true), chunkPlain("t", false) ); assertChunkListEqual(expected, actual); } @Test public void testParseAndHighlightSingleRegionInMultipleChunks() { List<TextChunk> actual = parsePathAndHighlight("/test/:test", "t/:te"); List<TextChunk> expected = createChunkList( chunkPlain("/tes", false), chunkPlain("t/", true), chunkParam(":te", true), chunkParam("st", false) ); assertChunkListEqual(expected, actual); } @Test public void testParseAndHighlightWithEmptySubstring() { List<TextChunk> actual = parsePathAndHighlight("/test/:test", ""); List<TextChunk> expected = createChunkList( chunkPlain("/test/", false), chunkParam(":test", false) ); assertChunkListEqual(expected, actual); } @Test public void testParseAndHighlightWithBlankSubstring() { List<TextChunk> actual = parsePathAndHighlight("/test/:test", " "); List<TextChunk> expected = createChunkList( chunkPlain("/test/", false), chunkParam(":test", false) ); assertChunkListEqual(expected, actual); } @Test public void testParseAndHighlightOnBounds() { List<TextChunk> actual = parsePathAndHighlight("/test/:test", "/test/"); List<TextChunk> expected = createChunkList( chunkPlain("/test/", true), chunkParam(":test", false) ); assertChunkListEqual(expected, actual); } @Test public void testParseActionAndHighlightOnBounds() { List<TextChunk> actual = parseActionAndHighlight("ctrl#action", "ctrl#"); List<TextChunk> expected = createChunkList( chunkPlain("ctrl#", true), chunkParam("action", false) ); assertChunkListEqual(expected, actual); } private void assertChunkListEqual(List<TextChunk> expectedList, List<TextChunk> actualList) { assertEquals("Tokens count are equal", expectedList.size(), actualList.size()); for(int i = 0; i < actualList.size(); i++) { TextChunk expected = expectedList.get(i); TextChunk actual = actualList.get(i); assertEquals("Token types are the same", expected.getType(), actual.getType()); assertEquals("Token texts are the same", expected.getText(), actual.getText()); assertEquals("Token highlight flags are the same", expected.isHighlighted(), actual.isHighlighted()); } } private static TextChunk chunkPlain(String text, boolean isHighlighted) { return createChunk(RoutePathChunk.PLAIN, text, isHighlighted); } private static TextChunk chunkParam(String text, boolean isHighlighted) { return createChunk(RoutePathChunk.PARAMETER, text, isHighlighted); } private static TextChunk chunkOptional(String text, boolean isHighlighted) { return createChunk(RoutePathChunk.OPTIONAL, text, isHighlighted); } private static TextChunk createChunk(int type, String text, boolean isHighlighted) { TextChunk chunk = new RoutePathChunk(text, type, 0); chunk.setHighlighted(isHighlighted); return chunk; } }