/*******************************************************************************
* Copyright (c) 2008,2010 itemis AG (http://www.itemis.eu) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package org.eclipse.emf.mwe2.language.tests.highlighting;
import java.util.List;
import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CharStream;
import org.antlr.runtime.Token;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.mwe2.language.services.Mwe2GrammarAccess;
import org.eclipse.emf.mwe2.language.tests.UiTestSetup;
import org.eclipse.emf.mwe2.language.ui.Mwe2UiModule;
import org.eclipse.emf.mwe2.language.ui.highlighting.MweHighlightingLexer;
import org.eclipse.emf.mwe2.language.ui.internal.Mwe2Activator;
import org.eclipse.xtext.Keyword;
import org.eclipse.xtext.TerminalRule;
import org.eclipse.xtext.common.types.access.IJvmTypeProvider.Factory;
import org.eclipse.xtext.junit4.AbstractXtextTests;
import org.eclipse.xtext.parser.antlr.ITokenDefProvider;
import org.eclipse.xtext.parser.antlr.XtextTokenStream;
import org.junit.Test;
@SuppressWarnings("restriction")
public class LexerTest extends AbstractXtextTests {
private MweHighlightingLexer lexer;
private ITokenDefProvider tokenDefProvider;
@Override
protected Mwe2GrammarAccess getGrammarAccess() {
return (Mwe2GrammarAccess) super.getGrammarAccess();
}
@Override
public void setUp() throws Exception {
super.setUp();
with(new UiTestSetup() {
@Override
protected Mwe2UiModule createUiModule(Mwe2Activator activator) {
return new Mwe2UiModule(activator) {
@Override
public Class<? extends Factory> bindIJvmTypeProvider$Factory() {
return null;
}
};
}
});
lexer = get(MweHighlightingLexer.class);
tokenDefProvider = get(ITokenDefProvider.class);
}
@Test public void testEmptyLiteral() {
parseStringLiteral("");
}
@Test public void testKeywords() {
TreeIterator<EObject> iterator = EcoreUtil.getAllContents(getGrammarAccess().getGrammar(), false);
while(iterator.hasNext()) {
EObject next = iterator.next();
if (next instanceof TerminalRule
|| next == getGrammarAccess().getConstantValueRule()) {
iterator.prune();
} else if (next instanceof Keyword) {
String value = ((Keyword) next).getValue();
if ("'".equals(value) || "\"".equals(value) || "\\".equals(value) || "${".equals(value))
value = "\\" + value;
parseStringLiteral(value);
}
}
}
@Test public void testKeywordPrefixes() {
parseStringLiteral("$", "impo", "/");
}
@Test public void testComments() {
parseStringLiteral("// something\n", "/* something */");
}
@Test public void testEscapedComments() {
parseStringLiteral("\\// something", "\\/* something");
}
@Test public void testWS() {
parseStringLiteral(" \\n\\r\\t", " import ");
}
@Test public void testAnyChar() {
parseStringLiteral("*/", "#", "/");
}
@Test public void testComplex() {
parseStringLiteral(
" import var id.id.* ",
" \\${ something . .* } ");
}
@Test public void testReference() {
parseStringLiteral(
"${something}",
"${ something }",
"${something. /* comment */ ^module}",
"${something.\nsomething // comment \n}");
}
@Test public void testReferences() {
parseStringLiteral(
"${something } ${ something.else}",
"${something}${else}");
}
@Test public void testIncompleteReference() {
parseStringLiteral("${}", "${", "${something", "${something.");
}
@Test public void testMixed() {
parseStringLiteral("import${something}", "$${something}", " ${something}}", "{${something}$");
}
protected void parseStringLiteral(String... literals) {
for(String literal: literals) {
String quoted = "'" + literal + "'";
parseSuccessfully(quoted, quoted);
quoted = '"' + literal + '"';
parseSuccessfully(quoted, quoted);
}
}
protected void parseSuccessfully(String input, String... expectedTokens) {
CharStream stream = new ANTLRStringStream(input);
lexer.setCharStream(stream);
XtextTokenStream tokenStream = new XtextTokenStream(lexer, tokenDefProvider);
List<?> tokens = tokenStream.getTokens();
assertEquals(input, expectedTokens.length, tokens.size());
for(int i = 0;i < tokens.size(); i++) {
Token token = (Token) tokens.get(i);
assertEquals(token.toString(), expectedTokens[i], token.getText());
}
}
}