blob: 9a5af16ff07a27a4f4c5ffcbd9792d219165bf40 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.netbeans.modules.groovy.gsp.lexer;
import junit.framework.TestCase;
import org.netbeans.api.lexer.TokenHierarchy;
import org.netbeans.api.lexer.TokenSequence;
import static org.netbeans.lib.lexer.test.LexerTestUtilities.assertTokenEquals;
/**
* Test GSP lexer.
*
* @author Martin Adamek
* @author Martin Janicek
*/
public class GspLexerTest extends TestCase {
public GspLexerTest(String testName) {
super(testName);
}
public void testOnlyHTML() {
String text = "<html>"
+ "<body>"
+ "<h1>Sample line</h1>"
+ "</body>"
+ "</html>";
TokenSequence<?> sequence = createTokenSequence(text);
checkNext(sequence, GspTokenId.HTML, "<html>");
checkNext(sequence, GspTokenId.HTML, "<body>");
checkNext(sequence, GspTokenId.HTML, "<h1>");
checkNext(sequence, GspTokenId.HTML, "Sample line</h1>");
checkNext(sequence, GspTokenId.HTML, "</body>");
checkNext(sequence, GspTokenId.HTML, "</html>");
}
public void testPairGTag() {
String text = "<g:if>"
+ "</g:if>";
TokenSequence<?> sequence = createTokenSequence(text);
checkNext(sequence, GspTokenId.GTAG_OPENING_START, "<g:");
checkNext(sequence, GspTokenId.GTAG_OPENING_NAME, "if");
checkNext(sequence, GspTokenId.GTAG_OPENING_END, ">");
checkNext(sequence, GspTokenId.GTAG_CLOSING_START, "</g:");
checkNext(sequence, GspTokenId.GTAG_CLOSING_NAME, "if");
checkNext(sequence, GspTokenId.GTAG_CLOSING_END, ">");
}
public void testPairGTagWithExpression() {
String text = "<g:if test=\"${}\">"
+ "</g:if>";
TokenSequence<?> sequence = createTokenSequence(text);
checkNext(sequence, GspTokenId.GTAG_OPENING_START, "<g:");
checkNext(sequence, GspTokenId.GTAG_OPENING_NAME, "if");
checkNext(sequence, GspTokenId.GTAG_ATTRIBUTE_NAME, " test=");
checkNext(sequence, GspTokenId.GTAG_ATTRIBUTE_VALUE, "\"");
checkNext(sequence, GspTokenId.GSTRING_START, "${");
checkNext(sequence, GspTokenId.GSTRING_END, "}");
checkNext(sequence, GspTokenId.GTAG_ATTRIBUTE_VALUE, "\"");
checkNext(sequence, GspTokenId.GTAG_OPENING_END, ">");
checkNext(sequence, GspTokenId.GTAG_CLOSING_START, "</g:");
checkNext(sequence, GspTokenId.GTAG_CLOSING_NAME, "if");
checkNext(sequence, GspTokenId.GTAG_CLOSING_END, ">");
}
// See issue 202243
public void testPairGTagWithExtendExpression() {
String text = "<g:if test=\"\\${}\">"
+ "</g:if>";
TokenSequence<?> sequence = createTokenSequence(text);
checkNext(sequence, GspTokenId.GTAG_OPENING_START, "<g:");
checkNext(sequence, GspTokenId.GTAG_OPENING_NAME, "if");
checkNext(sequence, GspTokenId.GTAG_ATTRIBUTE_NAME, " test=");
checkNext(sequence, GspTokenId.GTAG_ATTRIBUTE_VALUE, "\"");
checkNext(sequence, GspTokenId.GSTRING_START, "\\${");
checkNext(sequence, GspTokenId.GSTRING_END, "}");
checkNext(sequence, GspTokenId.GTAG_ATTRIBUTE_VALUE, "\"");
checkNext(sequence, GspTokenId.GTAG_OPENING_END, ">");
checkNext(sequence, GspTokenId.GTAG_CLOSING_START, "</g:");
checkNext(sequence, GspTokenId.GTAG_CLOSING_NAME, "if");
checkNext(sequence, GspTokenId.GTAG_CLOSING_END, ">");
}
public void testIndependentGTag() {
String text = "<g:if/>";
TokenSequence<?> sequence = createTokenSequence(text);
checkNext(sequence, GspTokenId.GTAG_OPENING_START, "<g:");
checkNext(sequence, GspTokenId.GTAG_OPENING_NAME, "if");
checkNext(sequence, GspTokenId.GTAG_INDEPENDENT_END, "/>");
}
public void testInnerGTag() {
String text = "<g:if>"
+ "<g:if test=\"\">"
+ "</g:if>"
+ "</g:if>";
TokenSequence<?> sequence = createTokenSequence(text);
checkNext(sequence, GspTokenId.GTAG_OPENING_START, "<g:");
checkNext(sequence, GspTokenId.GTAG_OPENING_NAME, "if");
checkNext(sequence, GspTokenId.GTAG_OPENING_END, ">");
checkNext(sequence, GspTokenId.GTAG_OPENING_START, "<g:");
checkNext(sequence, GspTokenId.GTAG_OPENING_NAME, "if");
checkNext(sequence, GspTokenId.GTAG_ATTRIBUTE_NAME, " test=");
checkNext(sequence, GspTokenId.GTAG_ATTRIBUTE_VALUE, "\"\"");
checkNext(sequence, GspTokenId.GTAG_OPENING_END, ">");
checkNext(sequence, GspTokenId.GTAG_CLOSING_START, "</g:");
checkNext(sequence, GspTokenId.GTAG_CLOSING_NAME, "if");
checkNext(sequence, GspTokenId.GTAG_CLOSING_END, ">");
checkNext(sequence, GspTokenId.GTAG_CLOSING_START, "</g:");
checkNext(sequence, GspTokenId.GTAG_CLOSING_NAME, "if");
checkNext(sequence, GspTokenId.GTAG_CLOSING_END, ">");
}
public void testHTMLandGTagCombination() {
String text =
"<html>"
+ "<g:if test=\"${t}\">"
+ "<div class=\"e\">"
+ "<g:renderErrors bean=\"${f.u}\" />"
+ "</div>"
+ "</g:if>"
+ "<div class=\"s\">${e.s}</div>"
+ "</html>";
TokenSequence<?> sequence = createTokenSequence(text);
checkNext(sequence, GspTokenId.HTML, "<html>");
checkNext(sequence, GspTokenId.GTAG_OPENING_START, "<g:");
checkNext(sequence, GspTokenId.GTAG_OPENING_NAME, "if");
checkNext(sequence, GspTokenId.GTAG_ATTRIBUTE_NAME, " test=");
checkNext(sequence, GspTokenId.GTAG_ATTRIBUTE_VALUE, "\"");
checkNext(sequence, GspTokenId.GSTRING_START, "${");
checkNext(sequence, GspTokenId.GSTRING_CONTENT, "t");
checkNext(sequence, GspTokenId.GSTRING_END, "}");
checkNext(sequence, GspTokenId.GTAG_ATTRIBUTE_VALUE, "\"");
checkNext(sequence, GspTokenId.GTAG_OPENING_END, ">");
checkNext(sequence, GspTokenId.HTML, "<div class=\"e\">");
checkNext(sequence, GspTokenId.GTAG_OPENING_START, "<g:");
checkNext(sequence, GspTokenId.GTAG_OPENING_NAME, "renderErrors");
checkNext(sequence, GspTokenId.GTAG_ATTRIBUTE_NAME, " bean=");
checkNext(sequence, GspTokenId.GTAG_ATTRIBUTE_VALUE, "\"");
checkNext(sequence, GspTokenId.GSTRING_START, "${");
checkNext(sequence, GspTokenId.GSTRING_CONTENT, "f.u");
checkNext(sequence, GspTokenId.GSTRING_END, "}");
checkNext(sequence, GspTokenId.GTAG_ATTRIBUTE_VALUE, "\"");
checkNext(sequence, GspTokenId.GTAG_INDEPENDENT_END, " />");
checkNext(sequence, GspTokenId.HTML, "</div>");
checkNext(sequence, GspTokenId.GTAG_CLOSING_START, "</g:");
checkNext(sequence, GspTokenId.GTAG_CLOSING_NAME, "if");
checkNext(sequence, GspTokenId.GTAG_CLOSING_END, ">");
checkNext(sequence, GspTokenId.HTML, "<div class=\"s\">");
checkNext(sequence, GspTokenId.GSTRING_START, "${");
checkNext(sequence, GspTokenId.GSTRING_CONTENT, "e.s");
checkNext(sequence, GspTokenId.GSTRING_END, "}");
checkNext(sequence, GspTokenId.HTML, "</div>");
checkNext(sequence, GspTokenId.HTML, "</html>");
}
public void testGStringInHTML() {
String text = "<a class=\"home\" href=\"${createLinkTo(dir:'')}\">Home</a>";
TokenSequence<?> sequence = createTokenSequence(text);
checkNext(sequence, GspTokenId.HTML, "<a class=\"home\" href=\"");
checkNext(sequence, GspTokenId.GSTRING_START, "${");
checkNext(sequence, GspTokenId.GSTRING_CONTENT, "createLinkTo(dir:'')");
checkNext(sequence, GspTokenId.GSTRING_END, "}");
checkNext(sequence, GspTokenId.HTML, "\">");
checkNext(sequence, GspTokenId.HTML, "Home</a>");
}
public void testGspDirective() {
String text =
"<%@page import=\"org.grails.bookmarks.*\" %>";
TokenSequence<?> sequence = createTokenSequence(text);
checkNext(sequence, GspTokenId.PAGE_DIRECTIVE_START, "<%@");
checkNext(sequence, GspTokenId.PAGE_DIRECTIVE_NAME, "page");
checkNext(sequence, GspTokenId.PAGE_ATTRIBUTE_NAME, " import=");
checkNext(sequence, GspTokenId.PAGE_ATTRIBUTE_VALUE, "\"org.grails.bookmarks.*\" ");
checkNext(sequence, GspTokenId.PAGE_DIRECTIVE_END, "%>");
}
public void testCommentHTMLstyle() {
String text = "<!--\n"
+ "A b c\n"
+ "-->\n";
TokenSequence<?> sequence = createTokenSequence(text);
checkNext(sequence, GspTokenId.COMMENT_HTML_STYLE_START, "<!--");
checkNext(sequence, GspTokenId.COMMENT_HTML_STYLE_CONTENT, "\nA b c\n");
checkNext(sequence, GspTokenId.COMMENT_HTML_STYLE_END, "-->");
}
public void testCommentGSPstyle() {
String text = "%{--\n"
+ "A b c\n"
+ "--}%\n";
TokenSequence<?> sequence = createTokenSequence(text);
checkNext(sequence, GspTokenId.COMMENT_GSP_STYLE_START, "%{--");
checkNext(sequence, GspTokenId.COMMENT_GSP_STYLE_CONTENT, "\nA b c\n");
checkNext(sequence, GspTokenId.COMMENT_GSP_STYLE_END, "--}%");
}
public void testCommentJSPstyle() {
String text = "<%--\n"
+ "A b c\n"
+ "--%>\n";
TokenSequence<?> sequence = createTokenSequence(text);
checkNext(sequence, GspTokenId.COMMENT_JSP_STYLE_START, "<%--");
checkNext(sequence, GspTokenId.COMMENT_JSP_STYLE_CONTENT, "\nA b c\n");
checkNext(sequence, GspTokenId.COMMENT_JSP_STYLE_END, "--%>");
}
public void testGspDefaultTempate() {
String text = "<!--\n"
+ "To change this template, choose Tools | Templates\n"
+ "and open the template in the editor.\n"
+ "-->\n"
+ "<%@ page contentType=\"text/html;charset=UTF-8\" %>"
+ "<html>"
+ "<body>"
+ "</body>"
+ "</html>";
TokenSequence<?> sequence = createTokenSequence(text);
checkNext(sequence, GspTokenId.COMMENT_HTML_STYLE_START, "<!--");
checkNext(sequence, GspTokenId.COMMENT_HTML_STYLE_CONTENT, "\n"
+ "To change this template, choose Tools | Templates\n"
+ "and open the template in the editor.\n");
checkNext(sequence, GspTokenId.COMMENT_HTML_STYLE_END, "-->");
checkNext(sequence, GspTokenId.WHITESPACE, "\n");
checkNext(sequence, GspTokenId.PAGE_DIRECTIVE_START, "<%@");
checkNext(sequence, GspTokenId.PAGE_DIRECTIVE_NAME, " page");
checkNext(sequence, GspTokenId.PAGE_ATTRIBUTE_NAME, " contentType=");
checkNext(sequence, GspTokenId.PAGE_ATTRIBUTE_VALUE, "\"text/html;charset=UTF-8\" ");
checkNext(sequence, GspTokenId.PAGE_DIRECTIVE_END, "%>");
checkNext(sequence, GspTokenId.HTML, "<html>");
checkNext(sequence, GspTokenId.HTML, "<body>");
checkNext(sequence, GspTokenId.HTML, "</body>");
checkNext(sequence, GspTokenId.HTML, "</html>");
}
private TokenSequence createTokenSequence(String text) {
return TokenHierarchy.create(text, GspLexerLanguage.getLanguage()).tokenSequence();
}
private void checkNext(TokenSequence<?> sequence, GspTokenId gspTokenId, String expectedContent) {
assertTrue(sequence.moveNext());
assertTokenEquals(sequence, gspTokenId, expectedContent, -1);
}
}