package de.neuland.jade4j.lexer; import com.google.gson.Gson; import de.neuland.jade4j.TestFileHelper; import de.neuland.jade4j.expression.JexlExpressionHandler; import de.neuland.jade4j.lexer.token.Eos; import de.neuland.jade4j.lexer.token.Token; import de.neuland.jade4j.template.FileTemplateLoader; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.ArrayUtils; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.*; import static org.assertj.core.api.Assertions.assertThat; @RunWith(Parameterized.class) public class OriginalLexer_0_0_8_Test { private static class ExpectedToken { String type; int line; String val; boolean selfClosing; } private static String[] ignoredCases = new String[]{"html", "yield-before-conditional-head", "each.else", "inheritance.extend.mixins", "while", "mixin-block-with-space"}; private static Map<String, String> mappedTypes = new HashMap<String, String>(); static { mappedTypes.put("attributelist", "attrs"); mappedTypes.put("cssid", "id"); mappedTypes.put("cssclass", "class"); mappedTypes.put("colon", ":"); mappedTypes.put("expression", "code"); mappedTypes.put("extendstoken", "extends"); mappedTypes.put("mixinblock", "mixin-block"); mappedTypes.put("pipelesstext", "start-pipeless-text"); mappedTypes.put("attributesblock", "&attributes"); mappedTypes.put("casetoken", "case"); } //TODO: Handle Text Tokens correct private boolean breakOnTextTokens(ExpectedToken expectedToken) { return "text".equals(expectedToken.type); } //TODO: FileReader do not reads last line correct => Scanner.java private boolean breakOnEndOfStreamTokens(Token token) { return token instanceof Eos; } private String typeOf(Token token) { String simpleClassName = token.getClass().getSimpleName().toLowerCase(); if (mappedTypes.containsKey(simpleClassName)) { return mappedTypes.get(simpleClassName); } return simpleClassName; } private ExpectedToken tokenFromJsonLine(String expected) { return new Gson().fromJson(expected, ExpectedToken.class); } private String readFile(String fileName) throws IOException { return FileUtils.readFileToString(new File(TestFileHelper.getLexer_0_0_8_ResourcePath("cases/" + fileName))); } private String file; public OriginalLexer_0_0_8_Test(String file) { this.file = file; } @Test public void shouldLexJadeToTokens() throws Exception { FileTemplateLoader loader1 = new FileTemplateLoader(TestFileHelper.getLexer_0_0_8_ResourcePath("cases/"), "UTF-8"); Lexer lexer1 = new Lexer(file, loader1, new JexlExpressionHandler()); LinkedList<Token> tokens = lexer1.getTokens(); String[] expected = readFile(file.replace(".jade", ".expected.json")).split("\\n"); for (int i = 0; i < expected.length; i++) { Token token = tokens.get(i); if (breakOnEndOfStreamTokens(token)) { break; } ExpectedToken expectedToken = tokenFromJsonLine(expected[i]); if (breakOnTextTokens(expectedToken)) { break; } assertToken(token, expectedToken); } } private void assertToken(Token token, ExpectedToken expectedToken) { assertThat(typeOf(token)).isEqualTo(expectedToken.type); assertThat(token.isSelfClosing()).isEqualTo(expectedToken.selfClosing); assertThat(token.getValue()).isEqualTo(expectedToken.val); //TODO: FileReader do not reads last line correct => Scanner.java //assertThat(token.getLineNumber()).isEqualTo(expectedToken.line); } @Parameterized.Parameters(name = "{0}") public static Collection<String[]> data() throws FileNotFoundException { File folder = new File(TestFileHelper.getLexer_0_0_8_ResourcePath("cases/")); Collection<File> files = FileUtils.listFiles(folder, new String[]{"jade"}, false); Collection<String[]> data = new ArrayList<String[]>(); for (File file : files) { if (!ArrayUtils.contains(ignoredCases, file.getName().replace(".jade", ""))) { data.add(new String[]{file.getName()}); } } return data; } }