/*******************************************************************************
 * Copyright (c) 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 v2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.wst.jsdt.ui.tests.documentation;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.Reader;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.wst.jsdt.core.IJavaScriptElement;
import org.eclipse.wst.jsdt.core.IJavaScriptUnit;
import org.eclipse.wst.jsdt.core.JavaScriptCore;
import org.eclipse.wst.jsdt.core.JavaScriptModelException;
import org.eclipse.wst.jsdt.ui.JSdocContentAccess;

public class DocumentationTest extends TestCase {
	private String fContents1 = "/*\n"
			+ " * Attempt content assist on each function, verify that the proposal shows up, that\n"
			+ " * camel case CA works, the the propsoal looks correct, the proposal info is displayed,\n"
			+ " * that occurance support works, that F3 works, that hover help is displayed, and that\n"
			+ " * the function is correctly displayed in the outline.\n" + " * \n"
			+ " * Also test out local functions, check functions that mask global functions. Try out\n"
			+ " * F3 and occurance support on function calls that have different parameter numbers than\n"
			+ " * the declared function.\n" + " */\n" + "\n" + "function zooKeeper() {\n" + "	\n" + "}\n" + "\n"
			+ "/**\n" + " * Some doc about zooKeeper1, can you see it?\n" + " */\n" + "function zooKeeper1() {\n"
			+ "	\n" + "}\n" + "\n" + "function zooKeeper2() {\n" + "	return \"zoo\";\n" + "}\n" + "\n" + "/**\n"
			+ " * \n" + " * @returns {Boolean}\n" + " */\n" + "function zooKeeper3() {\n" + "	return a;\n" + "}\n"
			+ "\n" + "function zooKeeper4(a, b) {\n" + "	\n" + "}\n" + "\n" + "/**\n"
			+ " * Some doc about zooKeeper5\n" + " * \n" + " * @param {String} a\n" + " * @param {Number} b\n"
			+ " */\n" + "function zooKeeper5(a, b) {\n" + "}\n" + "\n" + "function zooKeeper6(a) {\n"
			+ "	return true;\n" + "}\n" + "\n" + "/**\n" + " * hi\n" + " * @param {Date} a\n" + " * @returns {Date}\n"
			+ " */\n" + "function zooKeeper7(a) {\n" + "	return a;\n" + "}\n" + "\n" + "zooKeeper();\n"
			+ "zooKeeper(1);\n" + "zooKeeper1();\n" + "zooKeeper2();\n" + "zooKeeper3();\n" + "zooKeeper4(1, 3);\n"
			+ "zooKeeper5(\"hi\", 3);\n" + "zooKeeper6(1);\n" + "zooKeeper7(new Date());\n" + "zooKeeper7();\n" + "\n"
			+ "function local1() {\n" + "	/**\n" + "	 * hi\n" + "	 */\n" + "	function zooKeeper7() {}\n"
			+ "	function zooKeeper8(a) {}\n" + "	\n" + "	zooKeeper7();\n" + "}\n";

	public static Test suite() {
		TestSuite ts = new TestSuite(DocumentationTest.class);
		return ts;
	}

	public DocumentationTest(String testName) {
		super(testName);
	}

	private void assertDocContainsString(IJavaScriptElement element, String s) throws JavaScriptModelException,
			IOException {
		Reader reader = JSdocContentAccess.getContentReader(element, true);
		StringBuffer doc = new StringBuffer();
		if(reader != null) {
			char[] buf = new char[200];
			int read = 0;
			while((read = reader.read(buf)) > 0) {
				doc.append(buf, 0, read);
			}
			reader.close();
		}
		assertTrue("doc doesn't contain content we were looking for", doc.toString().indexOf(s) >= 0);
	}

	/**
	 * @param string
	 */
	private IJavaScriptUnit getUnit(String string) throws Exception {
		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("DocumentationTest_" + getName());
		IProjectDescription description = ResourcesPlugin.getWorkspace().newProjectDescription(
				"SelectionTest3_" + getName());
		description.setNatureIds(new String[] { JavaScriptCore.NATURE_ID });
		project.create(description, null);
		project.open(null);
		IFile file = project.getFile("testfile.js");
		file.create(new ByteArrayInputStream(string.getBytes()), true, null);
		return (IJavaScriptUnit) JavaScriptCore.create(file);
	}

	public void test01() throws Exception {
		IJavaScriptUnit unit = getUnit(fContents1);

		int offset = fContents1.indexOf("zooKeeper1();\n");
		IJavaScriptElement[] selected = unit.codeSelect(offset, 10);
		assertEquals("unexpected number of elements", 1, selected.length);
		assertEquals("unexpected element", "zooKeeper1", selected[0].getElementName());
		assertEquals("unexpected element type", IJavaScriptElement.METHOD, selected[0].getElementType());

		assertDocContainsString(selected[0], "doc about zooKeeper");
	}

	public void test02() throws Exception {
		IJavaScriptUnit unit = getUnit(fContents1);

		int offset = fContents1.indexOf("zooKeeper3();\n");
		IJavaScriptElement[] selected = unit.codeSelect(offset, 10);
		assertEquals("unexpected number of elements", 1, selected.length);
		assertEquals("unexpected element", "zooKeeper3", selected[0].getElementName());
		assertEquals("unexpected element type", IJavaScriptElement.METHOD, selected[0].getElementType());

		assertDocContainsString(selected[0], "Boolean");
	}

	public void test03() throws Exception {
		IJavaScriptUnit unit = getUnit(fContents1);

		int offset = fContents1.indexOf("zooKeeper5(\"hi");
		IJavaScriptElement[] selected = unit.codeSelect(offset, 10);
		assertEquals("unexpected number of elements", 1, selected.length);
		assertEquals("unexpected element", "zooKeeper5", selected[0].getElementName());
		assertEquals("unexpected element type", IJavaScriptElement.METHOD, selected[0].getElementType());

		assertDocContainsString(selected[0], "Some doc about zooKeeper5");
	}

	public void test04() throws Exception {
		IJavaScriptUnit unit = getUnit(fContents1);

		int offset = fContents1.indexOf("zooKeeper7(");
		IJavaScriptElement[] selected = unit.codeSelect(offset, 10);
		assertEquals("unexpected number of elements", 1, selected.length);
		assertEquals("unexpected element", "zooKeeper7", selected[0].getElementName());
		assertEquals("unexpected element type", IJavaScriptElement.METHOD, selected[0].getElementType());

		assertDocContainsString(selected[0], "Date");
	}
}
