/*******************************************************************************
 *  Copyright (c) 2010 IBM Corporation and others.
 *
 *  This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License 2.0
 *  which accompanies this distribution, and is available at
 *  https://www.eclipse.org/legal/epl-2.0/
 *
 *  SPDX-License-Identifier: EPL-2.0
 *
 *  Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.cdt.core.lrparser.tests;

import junit.framework.TestSuite;

public class LRCompletionHangingTest extends AbstractLRHangingTest {

	public static TestSuite suite() {
		return new TestSuite(LRCompletionHangingTest.class);
	}

	//test c
	public void testCompletionDoWhileForC() throws Exception {

		String code = "int main(int argc, char **argv) {" + "do{" + CONTENT_ASIST_CURSOR + "} while (i < 3);" + "}";

		runTestCase(code, getCLanguage());

	}

	//test cpp
	public void testCompletionDoWhileForCPP() throws Exception {

		String code = "int main(int argc, char **argv) {" + "do{" + CONTENT_ASIST_CURSOR + "} while (i < 3);" + "}";
		runTestCase(code, getCPPLanguage());
	}

	public void testCompletionTryCatch() throws Exception {

		String code = "int main(int argc, char **argv) {" + "try {" + CONTENT_ASIST_CURSOR + "}" +

				"catch(x){}" + "}";
		runTestCase(code, getCPPLanguage());

	}

	public void testCompletionTemplateFunctionForCPP() throws Exception {

		String code = "template " + CONTENT_ASIST_CURSOR + "<class myType>" + "myType GetA (myType a) {" + "return a;"
				+ "}" +

				"int main(int argc, char **argv) {" + "int x=0;" + "int y = GetA " + CONTENT_ASIST_CURSOR
				+ " <int> (x);" + "}";
		runTestCase(code, getCPPLanguage());
	}

	public void testCompletionIfForCPP() throws Exception {
		String code = "int main(int argc, char **argv) {" + "int x=0;" + "if" + CONTENT_ASIST_CURSOR + "(x>0){}" + "}";
		runTestCase(code, getCPPLanguage());

	}

	public void testCompletionTemplateClassForCPP() throws Exception {

		String code = "template" + CONTENT_ASIST_CURSOR + " <class T> " + "class Test {" + "T val;"
				+ "public:Test(T arg){" + "val = arg;" + "}" + "~" + CONTENT_ASIST_CURSOR + "Test();" + "};" + "Test::"
				+ CONTENT_ASIST_CURSOR + "~" + CONTENT_ASIST_CURSOR + "Test(){}" + "int main(int argc, char **argv) {"
				+ CONTENT_ASIST_CURSOR + "Test<" + CONTENT_ASIST_CURSOR + "int> t(1);" + "Test<" + CONTENT_ASIST_CURSOR
				+ "double>" + CONTENT_ASIST_CURSOR + "* dt = new dt(1.0);" + "S* s = dynamic_cast<S*"
				+ CONTENT_ASIST_CURSOR + ">(dt);" + "S* s = dynamic_cast" + CONTENT_ASIST_CURSOR + "<S*>(dt);" + "}";
		runTestCase(code, getCPPLanguage());
	}

	public void testCompletionSimpleIfForCPP() throws Exception {
		String code = "#" + CONTENT_ASIST_CURSOR + "include " + CONTENT_ASIST_CURSOR + "<iostream>" + "using "
				+ CONTENT_ASIST_CURSOR + "namespace std;" + "if" + CONTENT_ASIST_CURSOR + "(i>0)){}" + "int "
				+ CONTENT_ASIST_CURSOR + "*" + CONTENT_ASIST_CURSOR + " i " + CONTENT_ASIST_CURSOR + "="
				+ CONTENT_ASIST_CURSOR + " &" + CONTENT_ASIST_CURSOR + "j;" + "*" + CONTENT_ASIST_CURSOR + "j=0;" + "*"
				+ CONTENT_ASIST_CURSOR + "j++;" + "*i" + CONTENT_ASIST_CURSOR + "++ = " + CONTENT_ASIST_CURSOR
				+ "*j++;";
		runTestCase(code, getCPPLanguage());

	}

	public void testCompletionStructForCPP() throws Exception {
		String code = "struct " + CONTENT_ASIST_CURSOR + "p " + CONTENT_ASIST_CURSOR + "{" + CONTENT_ASIST_CURSOR
				+ "int w;" + "float p;" + "} " + CONTENT_ASIST_CURSOR + "a," + CONTENT_ASIST_CURSOR + "b,c;";

		runTestCase(code, getCPPLanguage());

	}

	public void testCompletionGnuCPP() throws Exception {
		String code = "if a>b ? " + CONTENT_ASIST_CURSOR + "g" + CONTENT_ASIST_CURSOR + ":l;" + "case 1..."
				+ CONTENT_ASIST_CURSOR + "3 : ok; ";
		runTestCase(code, getCPPLanguage());
	}

}
