package org.eclipse.dltk.tcl.ui.tests.folding;

import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.core.tests.model.AbstractModelTests;
import org.eclipse.dltk.tcl.internal.ui.text.folding.TclElementCommentResolver;
import org.eclipse.dltk.tcl.ui.tests.TclUITestsPlugin;
import org.eclipse.dltk.ui.text.folding.IElementCommentResolver;

public class TclCommentElementTests extends AbstractModelTests {

	private static final String PROJECT_NAME = "comments";

	public TclCommentElementTests(String name) {
		super(name);
	}

	public static Suite suite() {
		return new Suite(TclCommentElementTests.class);
	}

	public void setUpSuite() throws Exception {
		super.setUpSuite();
		setUpScriptProject(PROJECT_NAME, TclUITestsPlugin.PLUGIN_NAME);
	}

	public void tearDownSuite() throws Exception {
		deleteProject(PROJECT_NAME);
		super.tearDownSuite();
	}

	public void testCommentPositioning1() throws ModelException {
		ISourceModule module = getSourceModule(PROJECT_NAME, "src",
				"comments1.tcl");

		assertEquals("p1", getElementByComment(module, "p1_before"));
		assertEquals("p1", getElementByComment(module, "p1_inside"));

		assertNull(getElementByComment(module, "eof_comment"));
	}

	/**
	 * Gets a string pattern, searches for the comment that contains this
	 * pattern and returns IModelElement to which the comment corresponds
	 */
	protected String getElementByComment(ISourceModule module,
			String commentPattern) throws ModelException {
		final IElementCommentResolver resolver = new TclElementCommentResolver(
				module);
		IModelElement el = resolver.getElementByCommentPosition(module
				.getSource().indexOf(commentPattern), 0);
		if (el != null)
			return el.getElementName();
		else
			return null;
	}
}
