/*******************************************************************************
 * Copyright (c) 2004 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.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.StructuredModelManager;
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.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();
			if (region.getType() == contexts[i]) {
				if (region instanceof ITextRegionContainer) {
					ITextRegionContainer container = (ITextRegionContainer) region;
					boolean embeddedResult = checkSimpleRegionCount(container, embeddedContexts[embedCount].length) && checkSimpleRegionTypes(container.getRegions(), embeddedContexts[embedCount]);
					embedCount++;
					if (embeddedResult)
						continue;
					else
						return false;
				}
				else {
					continue;
				}
			}
			return false;
		}
		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
		if (!(regionContainer.getRegions().size() == size))
			return false;
		return true;
	}

	public static boolean checkSimpleRegionCounts(IStructuredDocumentRegionList regionContainers, int[] sizes) {

		int containers = regionContainers.getLength();
		if (containers != sizes.length)
			return false;
		for (int i = 0; i < sizes.length; i++) {
			if (i >= containers)
				return false;
			if (regionContainers.item(i).getNumberOfRegions() == sizes[i])
				continue;
			return false;
		}
		return true;
	}

	public static boolean checkSimpleRegionTypes(ITextRegionList regions, String[] contexts) {

		for (int i = 0; i < contexts.length; i++) {
			ITextRegion region = regions.get(i);
			if (region.getType() == contexts[i])
				continue;
			//			else
			//				Sys("region "+ i + ": "+region.getType()+" != " + contexts[i]);
			return false;
		}
		return true;
	}

	public static String loadChars(InputStream input) {

		StringBuffer s = new StringBuffer();
		try {
			int c = -1;
			while ((c = (char) 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 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 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 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);
	}

	/**
	 * 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, 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 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());
	}
}