blob: 050caa7a59307ba4e8329bb51c7c7e58bdeb8752 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 xored software, Inc.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* xored software, Inc. - initial API and Implementation (Alex Panchenko)
*******************************************************************************/
package org.eclipse.dltk.javascript.parser.tests;
import java.util.ArrayList;
import java.util.List;
import org.antlr.runtime.Token;
import org.eclipse.dltk.compiler.problem.IProblemReporter;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.builder.ISourceLineTracker;
import org.eclipse.dltk.core.tests.util.StringList;
import org.eclipse.dltk.javascript.ast.Script;
import org.eclipse.dltk.javascript.parser.JSParser;
import org.eclipse.dltk.javascript.parser.JSTokenStream;
import org.eclipse.dltk.javascript.parser.JavaScriptParser;
import org.eclipse.dltk.utils.TextUtils;
@SuppressWarnings("nls")
public class XmlLiteralTokenTests extends AbstractJSParserTest {
private static class TestParser extends JavaScriptParser {
/*
* increase visibility of inherited method
*/
@Override
public Script parse(IModelElement element, JSTokenStream stream,
ISourceLineTracker lineTracker, IProblemReporter reporter) {
return super.parse(element, stream, lineTracker, reporter);
}
}
protected List<Token> tokenize(final String code) {
final JSTokenStream stream = new JavaScriptParser()
.createTokenStream(code);
new TestParser().parse(null, stream, TextUtils.createLineTracker(code),
reporter);
return stream.getTokens();
}
protected List<Token> filter(List<Token> tokens) {
List<Token> result = null;
for (int i = 0, size = tokens.size(); i < size; ++i) {
Token token = tokens.get(i);
if (token.getChannel() != Token.HIDDEN_CHANNEL) {
if (result != null) {
result.add(token);
}
} else if (result == null) {
result = new ArrayList<Token>();
result.addAll(tokens.subList(0, i));
}
}
if (result != null) {
return result;
} else {
return tokens;
}
}
protected void assertTokenTypes(List<Token> tokens, int... tokenTypes) {
assertEquals(tokenTypes.length, tokens.size());
for (int i = 0; i < tokenTypes.length; ++i) {
assertEquals(tokenTypes[i], tokens.get(i).getType());
}
}
public void testXmlLiteralTokens() {
StringList code = new StringList();
code.add("var TOC = <xml>");
code.add("<entry label={homePageTitle}/>");
code.add("</xml>");
code.add("");
code.add("");
List<Token> tokens = tokenize(code.toString());
assertTokenTypes(tokens, JSParser.VAR, JSParser.WhiteSpace,
JSParser.Identifier, JSParser.WhiteSpace, JSParser.ASSIGN,
JSParser.WhiteSpace, JSParser.XMLFragment, JSParser.LBRACE,
JSParser.Identifier, JSParser.RBRACE, JSParser.XMLFragmentEnd,
JSParser.EOL, JSParser.EOL, JSParser.EOL);
tokens = filter(tokens);
assertTokenTypes(tokens, JSParser.VAR, JSParser.Identifier,
JSParser.ASSIGN, JSParser.XMLFragment, JSParser.LBRACE,
JSParser.Identifier, JSParser.RBRACE, JSParser.XMLFragmentEnd);
}
public void testXmlLiteralTokensWithCommment() {
final String code = "var x = <{name}/> // name\n";
final List<Token> tokens = filter(tokenize(code));
assertTokenTypes(tokens, JSParser.VAR, JSParser.Identifier,
JSParser.ASSIGN, JSParser.XMLFragment, JSParser.LBRACE,
JSParser.Identifier, JSParser.RBRACE, JSParser.XMLFragmentEnd);
}
}