/*******************************************************************************
 * Copyright (c) 2004, 2010 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.search;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import junit.framework.TestCase;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.search.IJavaSearchConstants;
import org.eclipse.jdt.core.search.SearchDocument;
import org.eclipse.jdt.core.search.SearchPattern;
import org.eclipse.jst.jsp.core.internal.java.IJSPTranslation;
import org.eclipse.jst.jsp.core.internal.java.JSPTranslation;
import org.eclipse.jst.jsp.core.internal.java.JSPTranslationAdapter;
import org.eclipse.jst.jsp.core.internal.java.search.JSPSearchScope;
import org.eclipse.jst.jsp.core.internal.java.search.JSPSearchSupport;
import org.eclipse.jst.jsp.core.internal.modelhandler.ModelHandlerForJSP;
import org.eclipse.jst.jsp.ui.internal.java.search.BasicJSPSearchRequestor;
import org.eclipse.jst.jsp.ui.tests.util.FileUtil;
import org.eclipse.jst.jsp.ui.tests.util.ProjectUnzipUtility;
import org.eclipse.osgi.service.datalocation.Location;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;


/**
 * Tests for JSPSearchSupport
 * @author pavery
 */
public class JSPSearchTests extends TestCase implements IJavaSearchConstants {

	/**
	 * to accept search matches
	 * addCheckMatch(...) for matches you expect, run search support, checkValid() to see if all expected got hit
	 */
	class TestJspSearchRequestor extends BasicJSPSearchRequestor {

		private List matches = null;

		public TestJspSearchRequestor() {
			this.matches = new ArrayList();
		}

		// called by search framework
		protected void addSearchMatch(IStructuredDocument jspDocument, IFile jspFile, int jspStart, int jspEnd, String jspText) {
			this.matches.remove(new TestSearchMatch(jspFile.getName(), jspStart, jspEnd));
		}

		public void beginReporting() {
			// do nothing since we have no UI, don't access ISearchResultView
		}

		public void endReporting() {
			// do nothing since we have no UI, don't access ISearchResultView
		}

		public void addCheckMatch(String filename, int jspStart, int jspEnd) {
			this.matches.add(new TestSearchMatch(filename, jspStart, jspEnd));
		}

		public boolean checkValid() {
			return this.matches.isEmpty();
		}

		public void clear() {
			this.matches.clear();
		}
	}

	/**
	 * to validate search matches (checkMatch matches a search hit)
	 */
	class TestSearchMatch {

		public String filename = null;
		public int jspStart = -1;
		public int jspEnd = -1;

		public TestSearchMatch(String filename, int jspStart, int jspEnd) {
			this.filename = filename;
			this.jspStart = jspStart;
			this.jspEnd = jspEnd;
		}

		public boolean equals(Object obj) {
			if (!(obj instanceof TestSearchMatch))
				return false;

			TestSearchMatch possible = (TestSearchMatch) obj;
			return this.filename.equalsIgnoreCase(possible.filename) && this.jspStart == possible.jspStart && this.jspEnd == possible.jspEnd;
		}
	}

	private ProjectUnzipUtility projUtil = null;
	private boolean isSetup = false;

	public JSPSearchTests() {
		super("JSP Search Tests");
	}

	protected void setUp() throws Exception {
		super.setUp();
		if (!this.isSetup) {
			doSetup();
			this.isSetup = true;
		}
	}

	private void doSetup() throws Exception {

		this.projUtil = new ProjectUnzipUtility();

		// root of workspace directory
		Location platformLocation = Platform.getInstanceLocation();

		File zipFile = FileUtil.makeFileFor(ProjectUnzipUtility.PROJECT_ZIPS_FOLDER, "jspsearch_tests.zip", ProjectUnzipUtility.PROJECT_ZIPS_FOLDER);
		this.projUtil.unzipAndImport(zipFile, platformLocation.getURL().getFile());
		this.projUtil.initJavaProject("judo");

		//JSPSearchSupport.getInstance().indexWorkspaceAndWait();
	}

	protected void tearDown() throws Exception {
		super.tearDown();
		// do nothing
	}

	public void testIndexWorkspace() {
		JSPSearchSupport support = JSPSearchSupport.getInstance();
		SearchDocument doc = JSPSearchSupport.getInstance().getSearchDocument("/judo/searchTestJSP.java");
		assertNotNull("couldn't retrieve:'/judo/searchTestJSP.java'", doc);

		doc = support.getSearchDocument("/judo/searchTestJSP2.java");
		assertNotNull("couldn't retrieve:'/judo/searchTestJSP2.java'", doc);

		doc = support.getSearchDocument("/judo/searchTestJSP3.java");
		assertNotNull("couldn't retrieve:'/judo/searchTestJSP3.java'", doc);
	}

	public void testSearchField() {

		TestJspSearchRequestor requestor = new TestJspSearchRequestor();
		requestor.addCheckMatch("searchTestJSP.jsp", 93, 106);
		JSPSearchSupport.getInstance().search("searchForThis", new JSPSearchScope(), FIELD, ALL_OCCURRENCES, SearchPattern.R_EXACT_MATCH, true, requestor, new NullProgressMonitor());
		assertTrue("did not find all expected matches: searchForThis", requestor.checkValid());
	}

	public void testSearchMethod() {

		TestJspSearchRequestor requestor = new TestJspSearchRequestor();
		requestor.addCheckMatch("searchTestJSP.jsp", 143, 158);
		requestor.addCheckMatch("searchTestJSP.jsp", 298, 315);
		JSPSearchSupport.getInstance().search("searchForMethod", new JSPSearchScope(), METHOD, ALL_OCCURRENCES, SearchPattern.R_EXACT_MATCH, true, requestor, new NullProgressMonitor());
		assertTrue("did not find all expected matches: searchForMethod", requestor.checkValid());
	}

	public void testSearchPatternMatch() {

		TestJspSearchRequestor requestor = new TestJspSearchRequestor();
		requestor.addCheckMatch("searchTestJSP.jsp", 93, 106);
		requestor.addCheckMatch("searchTestJSP2.jsp", 116, 129);
		requestor.addCheckMatch("searchTestJSP2.jsp", 152, 165);
		JSPSearchSupport.getInstance().search("search*", new JSPSearchScope(), FIELD, ALL_OCCURRENCES, SearchPattern.R_PATTERN_MATCH, true, requestor, new NullProgressMonitor());
		assertTrue("did not find all expected matches: search*", requestor.checkValid());
	}

	public void testSearchProjectClasses() {

		TestJspSearchRequestor requestor = new TestJspSearchRequestor();
		requestor.addCheckMatch("searchTestJSP3.jsp", 148, 157);
		requestor.addCheckMatch("searchTestJSP3.jsp", 170, 179);
		requestor.addCheckMatch("searchTestJSP3.jsp", 263, 273);
		requestor.addCheckMatch("searchTestJSP3.jsp", 299, 309);
		requestor.addCheckMatch("searchTestJSP3.jsp", 408, 417);
		requestor.addCheckMatch("searchTestJSP3.jsp", 430, 439);
		JSPSearchSupport.getInstance().search("Jellybean*", new JSPSearchScope(), TYPE, ALL_OCCURRENCES, SearchPattern.R_PATTERN_MATCH, true, requestor, new NullProgressMonitor());
		assertTrue("did not find all expected matches: search*", requestor.checkValid());
	}

	public void testSearchLocalVariable() {

		IDOMModel xmlModel = null;
		try {
			IPath jspTestFilePath = new Path("judo/SEARCH/searchTestJSP3.jsp");
			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(jspTestFilePath);
			xmlModel = (IDOMModel) getStructuredModelForRead(file);
			ModelHandlerForJSP.ensureTranslationAdapterFactory(xmlModel);

			IDOMDocument doc = xmlModel.getDocument();
			JSPTranslationAdapter adapter = (JSPTranslationAdapter) doc.getAdapterFor(IJSPTranslation.class);
			JSPTranslation translation = adapter.getJSPTranslation();
			IJavaElement element = translation.getElementsFromJspRange(377, 384)[0];

			TestJspSearchRequestor requestor = new TestJspSearchRequestor();
			requestor.addCheckMatch("searchTestJSP3.jsp", 377, 384);
			JSPSearchSupport.getInstance().search(element, new JSPSearchScope(), requestor, new NullProgressMonitor());
			assertTrue("did not find all expected matches: search*", requestor.checkValid());
		}
		finally {
			if (xmlModel != null)
				xmlModel.releaseFromRead();
		}
	}

	private IStructuredModel getStructuredModelForRead(IFile file) {

		try {
			IModelManager modelManager = StructuredModelManager.getModelManager();
			return modelManager.getModelForRead(file);
		}
		catch (IOException ioex) {
			System.out.println("couldn't open file:" + file);
		}
		catch (CoreException e) {
			e.printStackTrace();
		}
		return null;
	}
}
