/*******************************************************************************
* Copyright (c) 2012 VMWare, Inc.
* 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
*
* Contributors:
* VMWare, Inc. - initial API and implementation
*******************************************************************************/
package org.grails.ide.eclipse.test.gsp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.StringReader;
import java.io.StringWriter;
import junit.framework.TestCase;
import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion;
import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
import org.grails.ide.eclipse.editor.gsp.parser.GSPTokenizer;
/**
* Copy tests from org.eclipse.jst.jsp.ui.tests for the scanner
* @author Andrew Eisenberg
* @author Christian Dupuis
* @created Dec 7, 2009
*/
public class GSPTokenizerTest extends TestCase {
private GSPTokenizer tokenizer = null;
private void reset(Reader in) {
tokenizer.reset(in);
}
private void reset(String filename) {
Reader fileReader = null;
try {
fileReader = new InputStreamReader(getClass().getResourceAsStream(
filename), "utf8");
} catch (IOException e) {
StringWriter s = new StringWriter();
e.printStackTrace(new PrintWriter(s));
fail(s.toString());
}
BufferedReader reader = new BufferedReader(fileReader);
reset(reader);
}
protected void setUp() throws Exception {
super.setUp();
tokenizer = new GSPTokenizer();
}
protected void tearDown() throws Exception {
super.tearDown();
tokenizer = null;
}
public void test144807_AttrName() {
String input = "";
for (int i = 0; i < 400; i++) {
input = input += "<a ";
}
try {
reset(new StringReader(input));
assertTrue("empty input", tokenizer.getNextToken() != null);
while (tokenizer.getNextToken() != null) {
// really, we just want to loop
}
} catch (IOException e) {
StringWriter s = new StringWriter();
e.printStackTrace(new PrintWriter(s));
fail(s.toString());
}
}
public void test144807_AttrValue() {
String input = "<a b=";
for (int i = 0; i < 400; i++) {
input = input += "<a ";
}
try {
reset(new StringReader(input));
assertTrue("empty input", tokenizer.getNextToken() != null);
while (tokenizer.getNextToken() != null) {
// really, we just want to loop
}
} catch (IOException e) {
StringWriter s = new StringWriter();
e.printStackTrace(new PrintWriter(s));
fail(s.toString());
}
}
public void test144807_Equals() {
String input = "<a b";
for (int i = 0; i < 400; i++) {
input = input += "<a ";
}
try {
reset(new StringReader(input));
assertTrue("empty input", tokenizer.getNextToken() != null);
while (tokenizer.getNextToken() != null) {
// really, we just want to loop
}
} catch (IOException e) {
StringWriter s = new StringWriter();
e.printStackTrace(new PrintWriter(s));
fail(s.toString());
}
}
public void testInsertComment() {
reset("jspcomment01.jsp");
try {
assertTrue("empty input", tokenizer.getNextToken() != null);
while (tokenizer.getNextToken() != null) {
// really, we just want to loop
}
} catch (IOException e) {
StringWriter s = new StringWriter();
e.printStackTrace(new PrintWriter(s));
fail(s.toString());
} catch (StackOverflowError e) {
StringWriter s = new StringWriter();
e.printStackTrace(new PrintWriter(s));
fail(s.toString());
}
// success if StackOverFlowError does not occur with tokenizer.
assertTrue(true);
}
// [260004]
public void test26004() {
String input = "<c:set var=\"foo\" value=\"${foo} bar #\" /> <div id=\"container\" >Test</div>";
try {
reset(new StringReader(input));
ITextRegion region = tokenizer.getNextToken();
assertTrue("empty input", region != null);
while (region != null) {
if (region.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
region = tokenizer.getNextToken();
assertNotNull("document consumed by trailing $ or #",
region);
} else
region = tokenizer.getNextToken();
}
} catch (IOException e) {
StringWriter s = new StringWriter();
e.printStackTrace(new PrintWriter(s));
fail(s.toString());
}
}
// [150794]
public void test150794() {
String input = "<a href=\"<jsp:getProperty/>\">";
try {
reset(new StringReader(input));
ITextRegion region = tokenizer.getNextToken();
assertTrue("empty input", region != null);
while (region != null) {
if (region.getType() == DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE) {
region = tokenizer.getNextToken();
assertNotNull("document consumed by embedded JSP tag",
region);
} else
region = tokenizer.getNextToken();
}
} catch (IOException e) {
StringWriter s = new StringWriter();
e.printStackTrace(new PrintWriter(s));
fail(s.toString());
}
}
// Need to simulate typing characters into the document to cause the stack
// overflow.
// Test is irrelevant due to changes in [280496]
/*
* public void test265380() throws Exception { String projectName =
* "bug_265380"; int oldDepth = BooleanStack.maxDepth; // Make the maxDepth
* equivalent to that we'd see in a normal editor BooleanStack.maxDepth =
* 100; // Create new project IProject project =
* BundleResourceUtil.createSimpleProject(projectName, null, null);
* assertTrue(project.exists());
* BundleResourceUtil.copyBundleEntriesIntoWorkspace("/testfiles/" +
* projectName, "/" + projectName); IFile file =
* project.getFile("test265380.jsp"); assertTrue(file.exists());
*
* IStructuredModel model =
* StructuredModelManager.getModelManager().getModelForEdit(file);
*
* try { IStructuredDocument jspDocument = model.getStructuredDocument();
*
* // offset in the document to begin inserting text int offset = 414; //
* String to insert character-by-character String cif =
* "<c:out value=\"lorem ipsum\"></c:out>\n"; // It takes several tags to be
* inserted before the stack was overflowed for (int i = 0; i < 10; i++) {
* for (int j = 0; j < cif.length(); j++) jspDocument.replace(offset++, 0,
* String.valueOf(cif.charAt(j))); } } catch (StackOverflowError e) {
* fail("Stack overflow encountered while editing document."); } finally {
* if (model != null) model.releaseFromEdit(); BooleanStack.maxDepth =
* oldDepth; } }
*/
}