/******************************************************************************* * Copyright (c) 2004, 2012 IBM Corporation 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 * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jst.jsp.ui.tests.other; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.eclipse.jst.jsp.core.internal.modelhandler.ModelHandlerForJSP; import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts; import org.eclipse.wst.sse.core.StructuredModelManager; import org.eclipse.wst.sse.core.internal.ltk.modelhandler.IModelHandler; import org.eclipse.wst.sse.core.internal.ltk.parser.BlockMarker; import org.eclipse.wst.sse.core.internal.ltk.parser.BlockTagParser; import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegionList; import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegion; import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionCollection; import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionContainer; import org.eclipse.wst.sse.core.internal.provisional.text.ITextRegionList; import org.eclipse.wst.sse.core.internal.text.CoreNodeList; import org.eclipse.wst.xml.core.internal.modelhandler.ModelHandlerForXML; import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext; /** * @author Nitin Dahyabhai <nitind@us.ibm.com> */ public class ScannerUnitTests extends TestCase { public static boolean checkComplexRegionTypes(ITextRegionList regions, String[] contexts, String[][] embeddedContexts) { int embedCount = 0; Iterator iterator = regions.iterator(); for (int i = 0; i < contexts.length; i++) { if (!iterator.hasNext()) return false; ITextRegion region = (ITextRegion) iterator.next(); assertEquals("context " + i + " incorrect", contexts[i], region.getType()); if (region instanceof ITextRegionContainer) { ITextRegionContainer container = (ITextRegionContainer) region; boolean embeddedResult = checkSimpleRegionCount(container, embeddedContexts[embedCount].length) && checkSimpleRegionTypes(container.getRegions(), embeddedContexts[embedCount]); embedCount++; assertTrue(embeddedResult); } } return true; } public static boolean checkModelLength(IStructuredDocument document, int length) { return checkModelLength(document.getLastStructuredDocumentRegion(), length); } public static boolean checkModelLength(IStructuredDocumentRegion region, int length) { return region.getEndOffset() == length; } public static boolean checkSimpleRegionCount(ITextRegionContainer regionContainer, int size) { // yes, this looks silly, but it makes it easier to find the exact // failure point assertEquals("region count", size, regionContainer.getNumberOfRegions()); return true; } public static boolean checkSimpleRegionCounts(IStructuredDocumentRegionList regionContainers, int[] sizes) { int containers = regionContainers.getLength(); assertEquals("different number of containers", sizes.length, containers); for (int i = 0; i < sizes.length; i++) { assertEquals("container " + i + " is different", sizes[i], regionContainers.item(i).getNumberOfRegions()); continue; } return true; } public static boolean checkSimpleRegionTypes(ITextRegionList regions, String[] contexts) { for (int i = 0; i < contexts.length; i++) { ITextRegion region = regions.get(i); assertEquals("region type " + i, contexts[i], region.getType()); } return true; } public static String loadChars(InputStream input) { StringBuffer s = new StringBuffer(); try { int c = -1; while ((c = input.read()) >= 0) { if (c > 255) break; s.append((char) c); } input.close(); } catch (IOException e) { System.out.println("An I/O error occured while scanning :"); System.out.println(e); } catch (Exception e) { e.printStackTrace(); } return s.toString(); } /** * Starts the application. * * @param args * an array of command-line arguments */ public static void main(java.lang.String[] args) { if (args == null || args.length == 0) { runAll(); } else if (args.length == 1) { String methodToRun = args[0].trim(); runOne(methodToRun); } } protected static void runAll() { junit.textui.TestRunner.run(suite()); } protected static void runOne(String methodName) { TestSuite testSuite = new TestSuite(); TestCase test = new ScannerUnitTests(methodName); testSuite.addTest(test); junit.textui.TestRunner.run(testSuite); } protected static Test suite() { return new TestSuite(ScannerUnitTests.class); } public static void verifyLengths(int startOffset, IStructuredDocumentRegion firstDocumentRegion, String text) { IStructuredDocumentRegion holdRegion = firstDocumentRegion; assertTrue("document does not start at expected offset", holdRegion.getStartOffset() == startOffset); int lastEnd = 0; while (holdRegion != null && holdRegion.getEndOffset() > 0) { assertTrue("zero-length StructuredDocumentRegion found", holdRegion.getStartOffset() == lastEnd); assertTrue("TextRegionless StructuredDocumentRegion found", holdRegion.getNumberOfRegions() > 0); ITextRegionList list = holdRegion.getRegions(); int index = 0; for (int i = 0; i < list.size(); i++) { ITextRegion region = list.get(i); assertTrue("text region seams don't match", region.getStart() == index); index += region.getLength(); } lastEnd = holdRegion.getEndOffset(); holdRegion = holdRegion.getNext(); } holdRegion = firstDocumentRegion; while (holdRegion != null && holdRegion.getNext() != null) { holdRegion = holdRegion.getNext(); } checkModelLength(holdRegion, text.length()); } public static void verifyLengths(int startOffset, IStructuredDocumentRegionList list, String text) { verifyLengths(startOffset, list.item(0), text); } public static void verifyLengths(IStructuredDocument document, String text) { verifyLengths(0, document.getFirstStructuredDocumentRegion(), text); } public static void verifyLengths(IStructuredModel model, String text) { verifyLengths(model.getStructuredDocument(), text); } protected IStructuredDocument fModel; protected String input; private BlockTagParser parser; protected Object type; public ScannerUnitTests(String name) { super(name); } protected void appendTagBlock(StringBuffer buffer, String tagname, int length) { buffer.append('<'); buffer.append(tagname); buffer.append('>'); for (int i = 0; i < length; i++) buffer.append('_'); buffer.append("</"); buffer.append(tagname); buffer.append('>'); } protected void setUp() { setUpXML(null); } protected IStructuredDocumentRegionList setUpJSP(String text) { setupModel(new ModelHandlerForJSP()); parser.addBlockMarker(new BlockMarker("script", null, DOMRegionContext.BLOCK_TEXT, false)); parser.addBlockMarker(new BlockMarker("style", null, DOMRegionContext.BLOCK_TEXT, false)); parser.addBlockMarker(new BlockMarker("disallowJSP", null, DOMRegionContext.BLOCK_TEXT, true, false)); /* * IStructuredDocumentRegionList nodes = setUpJSP("content <script> * <%= expression %> </script> <a> </a> <foo:disallowJSP> <%= %> * </foo:disallowJSP> >"); parser.addBlockMarker(new * BlockMarker("jsp:declaration", null, * XMLJSPRegionContexts.JSP_CONTENT, true)); parser.addBlockMarker(new * BlockMarker("jsp:expression", null, * XMLJSPRegionContexts.JSP_CONTENT, true)); parser.addBlockMarker(new * BlockMarker("jsp:scriptlet", null, * XMLJSPRegionContexts.JSP_CONTENT, true)); */ input = text; fModel.set(input); return fModel.getRegionList(); } protected void setupModel(IModelHandler contentType) { fModel = (IStructuredDocument) contentType.getDocumentLoader().createNewStructuredDocument(); this.parser = (BlockTagParser) fModel.getParser(); } protected IStructuredDocumentRegionList setUpXML(String text) { setupModel(new ModelHandlerForXML()); parser.addBlockMarker(new BlockMarker("script", null, DOMRegionContext.BLOCK_TEXT, false)); parser.addBlockMarker(new BlockMarker("style", null, DOMRegionContext.BLOCK_TEXT, false)); parser.addBlockMarker(new BlockMarker("disallowJSP", null, DOMRegionContext.BLOCK_TEXT, true, false)); input = text; fModel.set(input); return fModel.getRegionList(); } protected void testBlockScanBufferBoundaries(String contentTypeID) { IStructuredDocument document = null; // the interesting offsets are around 16k (16384) // for (int i = 16500; i > 16100; i--) { // for (int i = 17000; i > 15000; i--) { for (int i = 16384 + 25; i > 16364 - 25; i--) { StringBuffer text = new StringBuffer(); document = StructuredModelManager.getModelManager().createStructuredDocumentFor(contentTypeID); appendTagBlock(text, "script", i); String string = text.toString(); try { document.setText(this, string); verifyLengths(document, string); assertTrue("too few document regions [run value " + i + "] ", new CoreNodeList(document.getFirstStructuredDocumentRegion()).getLength() == 3); verifyLengths(document, string); IStructuredDocumentRegion startTag = document.getFirstStructuredDocumentRegion(); IStructuredDocumentRegion middleBlock = startTag.getNext(); // IStructuredDocumentRegion endTag = middleBlock.getNext(); assertTrue("not block text in middle", middleBlock.getFirstRegion().getType() == DOMRegionContext.BLOCK_TEXT); } catch (Exception e) { assertNull("exception caught" + e, e); } // System.gc(); } } public void testBlockScanBufferBoundariesForHTML() { testBlockScanBufferBoundaries("org.eclipse.wst.html.core.htmlsource"); } public void testBlockScanBufferBoundariesForJSP() { testBlockScanBufferBoundaries("org.eclipse.jst.jsp.core.jspsource"); } private void testBlockTag(IStructuredDocumentRegionList nodes) { boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 6, 1, 3, 1}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(2).getRegions(), new String[]{DOMRegionContext.BLOCK_TEXT}) && checkSimpleRegionTypes(nodes.item(3).getRegions(), new String[]{DOMRegionContext.XML_END_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(4).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testCommentMarkupLike() { IStructuredDocumentRegionList nodes = setUpJSP("<!-- if (a<b) -->"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[] {3}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[] { DOMRegionContext.XML_COMMENT_OPEN, DOMRegionContext.XML_COMMENT_TEXT, DOMRegionContext.XML_COMMENT_CLOSE}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testCommentMarkup() { IStructuredDocumentRegionList nodes = setUpJSP("<!-- <div>Commented Out</div>-->"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[] {3}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[] { DOMRegionContext.XML_COMMENT_OPEN, DOMRegionContext.XML_COMMENT_TEXT, DOMRegionContext.XML_COMMENT_CLOSE}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testCommentEmbeddedCustomTag() { IStructuredDocumentRegionList nodes = setUpJSP("<!--<link HREF='<c:out value='localhost/file.css'/>'>--> Some text"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[] {3, 1}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[] { DOMRegionContext.XML_COMMENT_OPEN, DOMRegionContext.XML_COMMENT_TEXT, DOMRegionContext.XML_COMMENT_CLOSE}) && checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[] { DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testBlockTag_JSP() { testBlockTag(setUpJSP("begin <scrIPt type=\"pl2\"> </scrip t></scripts></scripts <///<!- ---></sCrIPt> end")); } /** * Check block tag scanning between XML content */ public void testBlockTag_XML() { testBlockTag(setUpXML("begin <scrIPt type=\"pl2\"> </scrip t></scripts></scripts <///<!- ---></sCrIPt> end")); } /** * Check block tag scanning between XML content */ public void testBlockTagWithJSPExpressions() { IStructuredDocumentRegionList nodes = setUpJSP("begin <script type=\"pl2\"> <%= \"expression\"%> </scrIPt> <a></a> <disallowJSP> <%= \"expression\" %> </disallowJSP> end"); // OLD // boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 6, // 3, 3, 1, 3, 3, 1, 3, 3, 3, 1}); // NEW boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 6, 3, 3, 1, 3, 3, 1, 3, 1, 3, 1}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); int i = 0; boolean typeCheck = checkSimpleRegionTypes(nodes.item(i++).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(i++).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_TAG_CLOSE}) && checkComplexRegionTypes(nodes.item(i++).getRegions(), new String[]{DOMRegionContext.BLOCK_TEXT, DOMRegionContext.BLOCK_TEXT, DOMRegionContext.BLOCK_TEXT}, new String[][]{{DOMJSPRegionContexts.JSP_EXPRESSION_OPEN, DOMJSPRegionContexts.JSP_CONTENT, DOMJSPRegionContexts.JSP_CLOSE}}) && checkSimpleRegionTypes(nodes.item(i++).getRegions(), new String[]{DOMRegionContext.XML_END_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(i++).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(i++).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(i++).getRegions(), new String[]{DOMRegionContext.XML_END_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(i++).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(i++).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}) // CORRECT BEHAVIOR && checkSimpleRegionTypes(nodes.item(i++).getRegions(), new String[]{DOMRegionContext.BLOCK_TEXT}) // OLD, BROKEN BEHAVIOR // && checkSimpleRegionTypes(nodes.item(i++).getRegions(), // new // String[]{ // XMLRegionContext.BLOCK_TEXT, // XMLRegionContext.BLOCK_TEXT, // XMLRegionContext.BLOCK_TEXT}) && checkSimpleRegionTypes(nodes.item(i++).getRegions(), new String[]{DOMRegionContext.XML_END_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(i++).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); verifyModelLength(); } private void testBufferUnderRun_1(IStructuredDocumentRegionList nodes) { boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 6, 2}); assertTrue("IStructuredDocumentRegion region count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(2).getRegions(), new String[]{DOMRegionContext.XML_COMMENT_OPEN, DOMRegionContext.XML_COMMENT_TEXT}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testBufferUnderRun_1_JSP() { testBufferUnderRun_1(setUpJSP("content <tag a=b/><!--c")); } /** * Check for buffer under-runs on block scanning */ public void testBufferUnderRun_1_XML() { testBufferUnderRun_1(setUpXML("content <tag a=b/><!--c")); } private void testBufferUnderRun_2(IStructuredDocumentRegionList nodes) { boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 6, 1}); assertTrue("IStructuredDocumentRegion region count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(2).getRegions(), new String[]{DOMRegionContext.XML_COMMENT_OPEN}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testBufferUnderRun_2_JSP() { testBufferUnderRun_2(setUpJSP("content <tag a=b/><!--")); } /** * Check for buffer under-runs on block scanning */ public void testBufferUnderRun_2_XML() { testBufferUnderRun_2(setUpXML("content <tag a=b/><!--")); } private void testCDATA(IStructuredDocumentRegionList nodes) { boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 3, 1}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_CDATA_OPEN, DOMRegionContext.XML_CDATA_TEXT, DOMRegionContext.XML_CDATA_CLOSE}) && checkSimpleRegionTypes(nodes.item(2).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testCDATA_JSP() { testCDATA(setUpJSP("a <![CDATA[<>!!<!!></&&&--<!--]]> b")); } /** * Check CDATA section scanning between content */ public void testCDATA_XML() { testCDATA(setUpXML("a <![CDATA[<>!!<!!></&&&--<!--]]> b")); } public void testCDATAinBlockJSP1() { setUpJSP("<script><![CDATA[ contents]]></script>"); } public void testCDATAinBlockJSP2() { setUpJSP("<script><![CDATA[</script>]]></script>"); } public void testCDATAinBlockJSP2a() { setUpJSP("<script><![CDATA[contents</script>]]></script>"); } public void testCDATAinBlockJSP2b() { setUpJSP("<script><![CDATA[</script>contents]]></script>"); } public void testCDATAinBlockJSP3() { setUpJSP("<script><![CDATA[]]></script>"); } public void testCDATAinBlockJSP4() { setUpJSP("<script><![CDATA[ ]]>"); } public void testCDATAinBlockJSP5() { setUpJSP("<script><![CDATA[ ]]]>"); } public void testCDATAinBlockJSP6() { setUpJSP("<script><![CDATA[ ]]"); } public void testCDATAinBlockJSP7() { setUpJSP("<script><![CDATA[ "); } public void testCDATAinBlockJSP8() { setUpJSP("<script><![CDATA["); } public void testCDATAinBlockXML1() { setUpXML("<script><![CDATA[ ]]></script>"); } public void testCDATAinBlockXML2() { setUpXML("<script><![CDATA[</script>]]></script>"); } public void testCDATAinBlockXML3() { setUpXML("<script><![CDATA[]]></script>"); } public void testCDATAinBlockXML4() { setUpXML("<script><![CDATA[ ]]>"); } public void testCDATAinBlockXML5() { setUpXML("<script><![CDATA[ ]]]>"); } public void testCDATAinBlockXML6() { setUpXML("<script><![CDATA[ ]]"); } public void testCDATAinBlockXML7() { setUpXML("<script><![CDATA[ "); } public void testCDATAinBlockXML8() { setUpXML("<script><![CDATA["); } /** * Check comments between XML content */ public void testComments_JSP() { String text = "a <!-- --><!----><%-- --%> b"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 3, 2, 3, 1}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_COMMENT_OPEN, DOMRegionContext.XML_COMMENT_TEXT, DOMRegionContext.XML_COMMENT_CLOSE}) && checkSimpleRegionTypes(nodes.item(2).getRegions(), new String[]{DOMRegionContext.XML_COMMENT_OPEN, DOMRegionContext.XML_COMMENT_CLOSE}) && checkSimpleRegionTypes(nodes.item(3).getRegions(), new String[]{DOMJSPRegionContexts.JSP_COMMENT_OPEN, DOMJSPRegionContexts.JSP_COMMENT_TEXT, DOMJSPRegionContexts.JSP_COMMENT_CLOSE}) && checkSimpleRegionTypes(nodes.item(4).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes.item(0), text); } /** * Check comments between JSP content */ public void testComments_XML() { String text = "a <!-- --><<!---->b"; IStructuredDocumentRegionList nodes = setUpXML(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 3, 1, 2, 1}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_COMMENT_OPEN, DOMRegionContext.XML_COMMENT_TEXT, DOMRegionContext.XML_COMMENT_CLOSE}) && checkSimpleRegionTypes(nodes.item(2).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN}) && checkSimpleRegionTypes(nodes.item(3).getRegions(), new String[]{DOMRegionContext.XML_COMMENT_OPEN, DOMRegionContext.XML_COMMENT_CLOSE}) && checkSimpleRegionTypes(nodes.item(4).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes.item(0), text); } private void testContent(IStructuredDocumentRegionList nodes) { boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); verifyModelLength(); } /** * Check simple content scanning */ public void testContentJSP() { testContent(setUpJSP("hello world")); } public void testContentXML() { testContent(setUpXML("hello world")); } public void testDirectiveInTagBody() { String text = "<BODY <%@ include file=\"commonEventHandlers.jspf\" %> dir=\"ltr\"> "; IStructuredDocumentRegionList documentRegionList = setUpJSP(text); verifyLengths(0, documentRegionList, text); checkSimpleRegionTypes(documentRegionList.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_TAG_CLOSE}); ITextRegionCollection coll = (ITextRegionCollection) documentRegionList.item(0).getRegions().get(2); checkSimpleRegionTypes(coll.getRegions(), new String[]{DOMJSPRegionContexts.JSP_DIRECTIVE_OPEN, DOMRegionContext.WHITE_SPACE, DOMJSPRegionContexts.JSP_DIRECTIVE_NAME, DOMRegionContext.WHITE_SPACE, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.WHITE_SPACE, DOMJSPRegionContexts.JSP_DIRECTIVE_CLOSE}); } public void testDollarsign_Leading() { IStructuredDocumentRegionList nodes = setUpJSP("<a type=\"$ \"/>"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{6}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testDollarsign_Single() { IStructuredDocumentRegionList nodes = setUpJSP("<a type=\"$\"/>"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{6}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testDollarsign_SingleWithSpaces() { IStructuredDocumentRegionList nodes = setUpJSP("<a type=\" $ \"/>"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{6}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testELinContent() { String text = "${out.foo}"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); sizeCheck = checkSimpleRegionCount(((ITextRegionContainer) nodes.item(0).getRegions().get(0)), 3); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); typeCheck = checkSimpleRegionTypes(((ITextRegionContainer) nodes.item(0).getRegions().get(0)).getRegions(), new String[]{DOMJSPRegionContexts.JSP_EL_OPEN, DOMJSPRegionContexts.JSP_EL_CONTENT, DOMJSPRegionContexts.JSP_EL_CLOSE}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes.item(0), text); } public void testELinTag() { String text = "<input type=\"button\" ${disabled? 'disabled=\"disabled\"':''}/>"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{7}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); sizeCheck = checkSimpleRegionCount(((ITextRegionContainer) nodes.item(0).getRegions().get(5)), 9); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_EMPTY_TAG_CLOSE}); assertTrue("region context type check", typeCheck); typeCheck = checkSimpleRegionTypes(((ITextRegionContainer) nodes.item(0).getRegions().get(5)).getRegions(), new String[]{ DOMJSPRegionContexts.JSP_EL_OPEN, DOMJSPRegionContexts.JSP_EL_CONTENT, DOMJSPRegionContexts.JSP_EL_SQUOTE, DOMJSPRegionContexts.JSP_EL_QUOTED_CONTENT, DOMJSPRegionContexts.JSP_EL_SQUOTE, DOMJSPRegionContexts.JSP_EL_CONTENT, DOMJSPRegionContexts.JSP_EL_SQUOTE, DOMJSPRegionContexts.JSP_EL_SQUOTE, DOMJSPRegionContexts.JSP_EL_CLOSE}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes.item(0), text); } public void testELtolerance_transparency_Dquote() { IStructuredDocumentRegionList nodes = setUpJSP("<a type=\"${out.foo}\"/>"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{6}); sizeCheck &= checkSimpleRegionCount(((ITextRegionContainer) nodes.item(0).getRegions().get(4)), 5); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE}); typeCheck &= checkSimpleRegionTypes(((ITextRegionContainer) nodes.item(0).getRegions().get(4)).getRegions(), new String[]{DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE, DOMJSPRegionContexts.JSP_EL_OPEN, DOMJSPRegionContexts.JSP_EL_CONTENT, DOMJSPRegionContexts.JSP_EL_CLOSE, DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testELtolerance_transparency_DquoteWithSpaces() { // note: whitespace on either side returns a WHITE_SPACE context IStructuredDocumentRegionList nodes = setUpJSP("<a type=\"_${out.foo}_\"/>"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{6}); sizeCheck &= checkSimpleRegionCount(((ITextRegionContainer) nodes.item(0).getRegions().get(4)), 7); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE}); typeCheck &= checkSimpleRegionTypes(((ITextRegionContainer) nodes.item(0).getRegions().get(4)).getRegions(), new String[]{DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMJSPRegionContexts.JSP_EL_OPEN, DOMJSPRegionContexts.JSP_EL_CONTENT, DOMJSPRegionContexts.JSP_EL_CLOSE, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testELtolerance_transparency_Squote() { IStructuredDocumentRegionList nodes = setUpJSP("<a type='${out.foo}'/>"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{6}); sizeCheck &= checkSimpleRegionCount(((ITextRegionContainer) nodes.item(0).getRegions().get(4)), 5); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE}); typeCheck &= checkSimpleRegionTypes(((ITextRegionContainer) nodes.item(0).getRegions().get(4)).getRegions(), new String[]{DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_SQUOTE, DOMJSPRegionContexts.JSP_EL_OPEN, DOMJSPRegionContexts.JSP_EL_CONTENT, DOMJSPRegionContexts.JSP_EL_CLOSE, DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_SQUOTE}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testEmbeddedJSPDeclaration() { IStructuredDocumentRegionList nodes = setUpJSP("content <foo bar=\"<%! int foo; %>\" baz=\"il\">"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 9}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkComplexRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_TAG_CLOSE,}, new String[][]{{DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE, DOMJSPRegionContexts.JSP_DECLARATION_OPEN, DOMJSPRegionContexts.JSP_CONTENT, DOMJSPRegionContexts.JSP_CLOSE, DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE, DOMRegionContext.WHITE_SPACE}}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testEmbeddedJSPDeclarationInCDATA() { IStructuredDocumentRegionList nodes = setUpJSP("<![CDATA[<%!%>]]>"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{3}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkComplexRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CDATA_OPEN, DOMRegionContext.XML_CDATA_TEXT, DOMRegionContext.XML_CDATA_CLOSE,}, new String[][]{{DOMJSPRegionContexts.JSP_DECLARATION_OPEN, DOMJSPRegionContexts.JSP_CLOSE}}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testEmbeddedJSPExpression() { IStructuredDocumentRegionList nodes = setUpJSP("content <foo bar=\"<%= \"Hello, World\"%>\" baz=\"il\">"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 9}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkComplexRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_TAG_CLOSE,}, new String[][]{{DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE, DOMJSPRegionContexts.JSP_EXPRESSION_OPEN, DOMJSPRegionContexts.JSP_CONTENT, DOMJSPRegionContexts.JSP_CLOSE, DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE, DOMRegionContext.WHITE_SPACE}}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testEmbeddedJSPExpressionInCDATA() { IStructuredDocumentRegionList nodes = setUpJSP("<![CDATA[<%=%>]]>"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{3}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkComplexRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CDATA_OPEN, DOMRegionContext.XML_CDATA_TEXT, DOMRegionContext.XML_CDATA_CLOSE,}, new String[][]{{DOMJSPRegionContexts.JSP_EXPRESSION_OPEN, DOMJSPRegionContexts.JSP_CLOSE}}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testEmbeddedJSPScriptlet() { IStructuredDocumentRegionList nodes = setUpJSP("content <foo bar=\"<% %>\" baz=\"il\">"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 9}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkComplexRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_TAG_CLOSE,}, new String[][]{{DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE, DOMJSPRegionContexts.JSP_SCRIPTLET_OPEN, DOMJSPRegionContexts.JSP_CONTENT, DOMJSPRegionContexts.JSP_CLOSE, DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE, DOMRegionContext.WHITE_SPACE}}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testEmbeddedJSPScriptletInCDATA() { IStructuredDocumentRegionList nodes = setUpJSP("<![CDATA[<%%>]]>"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{3}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkComplexRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CDATA_OPEN, DOMRegionContext.XML_CDATA_TEXT, DOMRegionContext.XML_CDATA_CLOSE,}, new String[][]{{DOMJSPRegionContexts.JSP_SCRIPTLET_OPEN, DOMJSPRegionContexts.JSP_CLOSE}}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testEmbeddedTagInAttr() { IStructuredDocumentRegionList nodes = setUpJSP("<a href=\"<jsp:getProperty/>\">"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{6}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkComplexRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_TAG_CLOSE}, new String[][]{{DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE, DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_EMPTY_TAG_CLOSE, DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE}}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testJSP_DHTMLimport() { String text = "<a> <?import type=\"foo\">"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{3, 1, 6}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}); assertTrue("region context type check", typeCheck); typeCheck = checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); typeCheck = checkSimpleRegionTypes(nodes.item(2).getRegions(), new String[]{DOMRegionContext.XML_PI_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_PI_CLOSE}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes, text); } public void testJSP_PI() { String text = "begin <?php asda;lsgjalg;lasjlajglajslkajlgajsljgaljglaj?>end"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 4, 1}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_PI_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_PI_CONTENT, DOMRegionContext.XML_PI_CLOSE}) && checkSimpleRegionTypes(nodes.item(2).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes.item(0), text); } public void testJSPAmpersandInTagNameInAttValue() { String text = "<a href=\"<a&b>\"/>"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{7, 1}); assertTrue("IStructuredDocumentRegion and ITextRegion count (tag)", sizeCheck); //sizeCheck = checkSimpleRegionCount(((ITextRegionContainer) nodes.item(0).getRegions().get(4)), 4); //assertTrue("IStructuredDocumentRegion and ITextRegion count (broken embedded tag)", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_CLOSE}); assertTrue("region context type check (tag)", typeCheck); //typeCheck = checkSimpleRegionTypes(((ITextRegionContainer) nodes.item(0).getRegions().get(4)).getRegions(), new String[]{DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE, DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.UNDEFINED}); //assertTrue("region context type check (broken embedded tag)", typeCheck); typeCheck = checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check (content)", typeCheck); verifyLengths(0, nodes, text); } public void testJSPCommentInXMLComment() { String text = "s<!--\n<%--c--%>\n-->\n<html>\n<body><script> <%--c--%> </script>\n"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 5, 1, 3, 1, 3, 3, 3, 3, 1}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); int item = 0; boolean typeCheck = checkSimpleRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkComplexRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_COMMENT_OPEN, DOMRegionContext.XML_COMMENT_TEXT, DOMRegionContext.XML_COMMENT_TEXT, DOMRegionContext.XML_COMMENT_TEXT, DOMRegionContext.XML_COMMENT_CLOSE}, new String[][]{{DOMJSPRegionContexts.JSP_COMMENT_OPEN, DOMJSPRegionContexts.JSP_COMMENT_TEXT, DOMJSPRegionContexts.JSP_COMMENT_CLOSE}}) && checkSimpleRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}) && checkComplexRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.BLOCK_TEXT, DOMRegionContext.BLOCK_TEXT, DOMRegionContext.BLOCK_TEXT}, new String[][]{{DOMJSPRegionContexts.JSP_COMMENT_OPEN, DOMJSPRegionContexts.JSP_COMMENT_TEXT, DOMJSPRegionContexts.JSP_COMMENT_CLOSE}}) && checkSimpleRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_END_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(9).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes.item(0), text); } public void testJSPCommentAtStartOfXMLCommentAndBlockTag() { String text = "s<!--<%--c--%>\n-->\n<html>\n<body><script><%--c--%> </script>\n"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 4, 1, 3, 1, 3, 3, 2, 3, 1}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); int item = 0; boolean typeCheck = checkSimpleRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); typeCheck = typeCheck && checkComplexRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_COMMENT_OPEN, DOMRegionContext.XML_COMMENT_TEXT, DOMRegionContext.XML_COMMENT_TEXT, DOMRegionContext.XML_COMMENT_CLOSE}, new String[][]{{DOMJSPRegionContexts.JSP_COMMENT_OPEN, DOMJSPRegionContexts.JSP_COMMENT_TEXT, DOMJSPRegionContexts.JSP_COMMENT_CLOSE}}); typeCheck = typeCheck && checkSimpleRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); typeCheck = typeCheck && checkSimpleRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}); typeCheck = typeCheck && checkSimpleRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); typeCheck = typeCheck && checkSimpleRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}); typeCheck = typeCheck && checkSimpleRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}); typeCheck = typeCheck && checkComplexRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.BLOCK_TEXT, DOMRegionContext.BLOCK_TEXT}, new String[][]{{DOMJSPRegionContexts.JSP_COMMENT_OPEN, DOMJSPRegionContexts.JSP_COMMENT_TEXT, DOMJSPRegionContexts.JSP_COMMENT_CLOSE}}); typeCheck = typeCheck && checkSimpleRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_END_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}); typeCheck = typeCheck && checkSimpleRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes.item(0), text); } public void testJSPCommentinXMLTag() { String text = "s<a <%--c--%> b=c/>\n"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 7, 1}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); int item = 0; boolean typeCheck = checkSimpleRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); typeCheck = typeCheck && checkComplexRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMJSPRegionContexts.JSP_COMMENT_TEXT, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE},new String[][]{{DOMJSPRegionContexts.JSP_COMMENT_OPEN, DOMJSPRegionContexts.JSP_COMMENT_TEXT, DOMJSPRegionContexts.JSP_COMMENT_CLOSE, DOMRegionContext.WHITE_SPACE}}); typeCheck = typeCheck && checkSimpleRegionTypes(nodes.item(item++).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes.item(0), text); } /** * Check that jsp:directive.(include|page|taglib) are recognized and * treated properly */ public void testJSPDirectiveTags() { String text = "begin <jsp:directive.taglib> <jsp:directive.page a> <jsp:directive.include a=> <jsp:directive.pages a=b> end"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 3, 1, 4, 1, 5, 1, 6, 1}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMJSPRegionContexts.JSP_DIRECTIVE_NAME, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(2).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(3).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMJSPRegionContexts.JSP_DIRECTIVE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(4).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(5).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMJSPRegionContexts.JSP_DIRECTIVE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(6).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(7).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(8).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes.item(0), text); } public void testJSPDollarsign_Trailing() { String text = "<a type=\" $\"/>"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{6}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes.item(0), text); } public void testJSPDollarsign_TrailingInContent() { String text = "nnn$<a type=\" $\"/>"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 1, 6}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check (content)", typeCheck); typeCheck = checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check (content)", typeCheck); typeCheck = checkSimpleRegionTypes(nodes.item(2).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE}); assertTrue("region context type check (tag)", typeCheck); verifyLengths(0, nodes.item(0), text); } /** * Check JSP code sections between HTML content */ public void testJSPExpression() { IStructuredDocumentRegionList nodes = setUpJSP("begin <%= \"Hello,World\" %> end"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 1, 1, 1, 1}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{DOMJSPRegionContexts.JSP_EXPRESSION_OPEN}) && checkSimpleRegionTypes(nodes.item(2).getRegions(), new String[]{DOMJSPRegionContexts.JSP_CONTENT}) && checkSimpleRegionTypes(nodes.item(3).getRegions(), new String[]{DOMJSPRegionContexts.JSP_CLOSE}) && checkSimpleRegionTypes(nodes.item(4).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testJSPGreaterThanInAttValue() { IStructuredDocumentRegionList nodes = setUpJSP("<a type=\">next\"/>"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{6}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); assertTrue("region is not somple", !(nodes.item(0).getRegions().get(4) instanceof ITextRegionContainer)); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testJSPInvalidTagNameInAttValue() { String text = "S<a type=\"a<4\"/>"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 6}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("IStructuredDocumentRegion and ITextRegion count (tag)", sizeCheck); //sizeCheck = checkSimpleRegionCount(((ITextRegionContainer) nodes.item(1).getRegions().get(4)), 5); //assertTrue("IStructuredDocumentRegion and ITextRegion count (att value)", sizeCheck); typeCheck = checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE}); assertTrue("region context type check (tag)", typeCheck); //typeCheck = checkSimpleRegionTypes(((ITextRegionContainer) nodes.item(1).getRegions().get(4)).getRegions(), new String[]{DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE}); //assertTrue("region context type check (att value)", typeCheck); verifyLengths(0, nodes.item(0), text); } public void testJSPLessThanInAttValue() { // bails out of the attribute value with an UNDEFINED region for the // end quote String text = "<button label=\"<previous\"/>"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{6}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); //sizeCheck = checkSimpleRegionCount(((ITextRegionContainer) nodes.item(0).getRegions().get(4)), 4); //assertTrue("IStructuredDocumentRegion and ITextRegion count (att value)", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE}); assertTrue("region context type check", typeCheck); // typeCheck = checkSimpleRegionTypes(((ITextRegionContainer) nodes.item(0).getRegions().get(4)).getRegions(), new String[]{DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE, DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.UNDEFINED}); // assertTrue("region context type check (att value)", typeCheck); verifyLengths(0, nodes.item(0), text); } /** * Check JSP code sections, as a tag, scanning between HTML content */ // public void testJSPScriptletTag() { // IStructuredDocumentRegionList nodes = setUpJSP("begin <jsp:scriptlet> // int foo = bar; //<jsp:Scriptlet>//</jsp:scriptlets</jsp:scriptlet> // end"); // // boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 3, 1, // 3, // 1}); // assertTrue("IStructuredDocumentRegion and ITextRegion count", // sizeCheck); // // boolean typeCheck = // checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{ // XMLRegionContext.XML_CONTENT}) // && checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{ // XMLRegionContext.XML_TAG_OPEN, // XMLRegionContext.XML_TAG_NAME, // XMLRegionContext.XML_TAG_CLOSE}) // && checkSimpleRegionTypes(nodes.item(2).getRegions(), new String[]{ // XMLJSPRegionContexts.JSP_CONTENT}) // && checkSimpleRegionTypes(nodes.item(3).getRegions(), new String[]{ // XMLRegionContext.XML_END_TAG_OPEN, // XMLRegionContext.XML_TAG_NAME, // XMLRegionContext.XML_TAG_CLOSE}) // && checkSimpleRegionTypes(nodes.item(4).getRegions(), new String[]{ // XMLJSPRegionContexts.XML_CONTENT}); // assertTrue("region context type check", typeCheck); // // verifyModelLength(); // } /** * Check JSP code sections, as a tag, scanning between HTML content */ // public void testJSPTextTag() { // IStructuredDocumentRegionList nodes = setUpJSP("begin <jsp:text> int // foo // = bar; //<jsp:TEXT>//</jsp:Texts</jsp:text> <a> </a> end"); // // boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 3, 1, // 3, // 1, 3, 1, 3, 1}); // assertTrue("IStructuredDocumentRegion and ITextRegion count", // sizeCheck); // // boolean typeCheck = // checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{ // XMLJSPRegionContexts.XML_CONTENT}) // && checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{ // XMLJSPRegionContexts.XML_TAG_OPEN, // XMLJSPRegionContexts.XML_TAG_NAME, // XMLJSPRegionContexts.XML_TAG_CLOSE}) // && checkSimpleRegionTypes(nodes.item(2).getRegions(), new String[]{ // XMLJSPRegionContexts.XML_CDATA_TEXT}) // && checkSimpleRegionTypes(nodes.item(3).getRegions(), new String[]{ // XMLJSPRegionContexts.XML_END_TAG_OPEN, // XMLJSPRegionContexts.XML_TAG_NAME, // XMLJSPRegionContexts.XML_TAG_CLOSE}) // && checkSimpleRegionTypes(nodes.item(4).getRegions(), new String[]{ // XMLJSPRegionContexts.XML_CONTENT}) // && checkSimpleRegionTypes(nodes.item(5).getRegions(), new String[]{ // XMLJSPRegionContexts.XML_TAG_OPEN, // XMLJSPRegionContexts.XML_TAG_NAME, // XMLJSPRegionContexts.XML_TAG_CLOSE}) // && checkSimpleRegionTypes(nodes.item(6).getRegions(), new String[]{ // XMLJSPRegionContexts.XML_CONTENT}) // && checkSimpleRegionTypes(nodes.item(7).getRegions(), new String[]{ // XMLJSPRegionContexts.XML_END_TAG_OPEN, // XMLJSPRegionContexts.XML_TAG_NAME, // XMLJSPRegionContexts.XML_TAG_CLOSE}) // && checkSimpleRegionTypes(nodes.item(8).getRegions(), new String[]{ // XMLJSPRegionContexts.XML_CONTENT}); // assertTrue("region context type check", typeCheck); // // verifyModelLength(); // } /** * Check that jsp:root is recognized and treated properly */ public void testJSPRootTag() { IStructuredDocumentRegionList nodes = setUpJSP("begin <jsp:root> <jsp:roots a> <jsp:roo a=> </jsp:root a=b><a>end"); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 3, 1, 4, 1, 5, 1, 6, 3, 1}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMJSPRegionContexts.JSP_ROOT_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(2).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(3).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(4).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(5).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(6).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(7).getRegions(), new String[]{DOMRegionContext.XML_END_TAG_OPEN, DOMJSPRegionContexts.JSP_ROOT_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(8).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(9).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testJSPTagInAttValue() { String text = "<a type=\"<a/>\"/>"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{6}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); sizeCheck = checkSimpleRegionCount(((ITextRegionContainer) nodes.item(0).getRegions().get(4)), 5); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE}); assertTrue("region context type check (tag)", typeCheck); typeCheck = checkSimpleRegionTypes(((ITextRegionContainer) nodes.item(0).getRegions().get(4)).getRegions(), new String[]{DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE, DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_EMPTY_TAG_CLOSE, DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE}); assertTrue("region context type check (att value)", typeCheck); verifyLengths(0, nodes, text); } public void testNothinginBlockJSP9() { String text = "<script>"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{3}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes.item(0), text); } public void testNothinginBlockXML9() { String text = "<script>"; IStructuredDocumentRegionList nodes = setUpXML(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{3}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes.item(0), text); } private void testSimpleTag(IStructuredDocumentRegionList nodes) { boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 10, 1}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_TAG_CLOSE}) && checkSimpleRegionTypes(nodes.item(2).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); verifyModelLength(); } public void testSimpleTag_JSP() { testSimpleTag(setUpJSP("0 <tagname attr1 attr2=value2 attr3=\"value3\"> 1")); } /** * Check simple tag scanning between XML content */ public void testSimpleTag_XML() { testSimpleTag(setUpXML("0 <tagname attr1 attr2=value2 attr3=\"value3\"> 1")); } public void testVBLinContent() { String text = "#{out.foo}"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); sizeCheck = checkSimpleRegionCount(((ITextRegionContainer) nodes.item(0).getRegions().get(0)), 3); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); typeCheck = checkSimpleRegionTypes(((ITextRegionContainer) nodes.item(0).getRegions().get(0)).getRegions(), new String[]{DOMJSPRegionContexts.JSP_VBL_OPEN, DOMJSPRegionContexts.JSP_VBL_CONTENT, DOMJSPRegionContexts.JSP_VBL_CLOSE}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes.item(0), text); } public void testVBLtolerance_transparency_Dquote() { String text = "<a type=\"#{out.foo}\"/>"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{6}); sizeCheck &= checkSimpleRegionCount(((ITextRegionContainer) nodes.item(0).getRegions().get(4)), 5); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE}); typeCheck &= checkSimpleRegionTypes(((ITextRegionContainer) nodes.item(0).getRegions().get(4)).getRegions(), new String[]{DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE, DOMJSPRegionContexts.JSP_VBL_OPEN, DOMJSPRegionContexts.JSP_VBL_CONTENT, DOMJSPRegionContexts.JSP_VBL_CLOSE, DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes.item(0), text); } public void testVBLtolerance_transparency_DquoteWithSpaces() { // note: whitespace on either side returns a WHITE_SPACE context String text = "<a type=\"_#{out.foo}_\"/>"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{6}); sizeCheck &= checkSimpleRegionCount(((ITextRegionContainer) nodes.item(0).getRegions().get(4)), 7); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE}); typeCheck &= checkSimpleRegionTypes(((ITextRegionContainer) nodes.item(0).getRegions().get(4)).getRegions(), new String[]{DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMJSPRegionContexts.JSP_VBL_OPEN, DOMJSPRegionContexts.JSP_VBL_CONTENT, DOMJSPRegionContexts.JSP_VBL_CLOSE, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_DQUOTE}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes.item(0), text); } public void testVBLtolerance_transparency_Squote() { String text = "<a type='#{out.foo}'/>"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{6}); sizeCheck &= checkSimpleRegionCount(((ITextRegionContainer) nodes.item(0).getRegions().get(4)), 5); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE}); typeCheck &= checkSimpleRegionTypes(((ITextRegionContainer) nodes.item(0).getRegions().get(4)).getRegions(), new String[]{DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_SQUOTE, DOMJSPRegionContexts.JSP_VBL_OPEN, DOMJSPRegionContexts.JSP_VBL_CONTENT, DOMJSPRegionContexts.JSP_VBL_CLOSE, DOMJSPRegionContexts.XML_TAG_ATTRIBUTE_VALUE_SQUOTE}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes, text); } public void testXML_DHTMLimport() { String text = "<a> <?import type=\"foo\">"; IStructuredDocumentRegionList nodes = setUpXML(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{3, 1, 3}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_CLOSE}); assertTrue("region context type check", typeCheck); typeCheck = checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); typeCheck = checkSimpleRegionTypes(nodes.item(2).getRegions(), new String[]{DOMRegionContext.XML_PI_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_PI_CONTENT}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes, text); } public void testXML_PI() { String text = "begin <?php asda;lsgjalg;lasjlajglajslkajlgajsljgaljglaj?>end"; IStructuredDocumentRegionList nodes = setUpXML(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{1, 4, 1}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}) && checkSimpleRegionTypes(nodes.item(1).getRegions(), new String[]{DOMRegionContext.XML_PI_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_PI_CONTENT, DOMRegionContext.XML_PI_CLOSE}) && checkSimpleRegionTypes(nodes.item(2).getRegions(), new String[]{DOMRegionContext.XML_CONTENT}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes.item(0), text); } public void testXMLDollarsign_Trailing() { String text = "<a type=\" $\"/>"; IStructuredDocumentRegionList nodes = setUpXML(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{6}); assertTrue("IStructuredDocumentRegion and ITextRegion count", sizeCheck); boolean typeCheck = checkSimpleRegionTypes(nodes.item(0).getRegions(), new String[]{DOMRegionContext.XML_TAG_OPEN, DOMRegionContext.XML_TAG_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_NAME, DOMRegionContext.XML_TAG_ATTRIBUTE_EQUALS, DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE, DOMRegionContext.XML_EMPTY_TAG_CLOSE}); assertTrue("region context type check", typeCheck); verifyLengths(0, nodes.item(0), text); } public void testUndefinedRegionContainer() { // see RATLC RATLC00284776 String text = "<option <elms:inputValue value=\"<%=uomvox.uomID%>\"/><%=uomvox.uomID.equals(uomID) ? \" selected\" : \"\"%>>"; IStructuredDocumentRegionList nodes = setUpJSP(text); boolean sizeCheck = checkSimpleRegionCounts(nodes, new int[]{5}); assertTrue("IStructuredDocumentRegion and overall ITextRegion count", sizeCheck); // checkComplexRegionTypes(nodes.item(0).getRegions(), new // String[]{XMLRegionContext.XML_TAG_OPEN, // XMLRegionContext.XML_TAG_NAME, // XMLRegionContext.XML_TAG_ATTRIBUTE_NAME, // XMLRegionContext.UNDEFINED, XMLRegionContext.XML_TAG_CLOSE}, new // String[][] {{}}); verifyEmbeddedContainerParentage(nodes); verifyLengths(0, nodes.item(0), text); } /** * @param nodes */ private void verifyEmbeddedContainerParentage(IStructuredDocumentRegionList nodes) { for (int i = 0; i < nodes.getLength(); i++) { IStructuredDocumentRegion r = nodes.item(i); ITextRegionList list = r.getRegions(); for (int j = 0; j < list.size(); j++) { ITextRegion region = list.get(j); if (region instanceof ITextRegionContainer) { assertNotNull("parent is null for " + region, ((ITextRegionContainer) region).getParent()); } } } } protected boolean verifyModelLength() { return checkModelLength(fModel, input.length()); } }