/*******************************************************************************
 * Copyright (c) 2018 Jesper Steen Møller 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:
 *     Jesper Steen Møller - initial API and implementation
 *                           bug 529556 - [18.3] Add content assist support for 'var' as a type
 *******************************************************************************/
package org.eclipse.jdt.core.tests.model;

import java.util.stream.Stream;

import org.eclipse.jdt.core.JavaModelException;

import junit.framework.Test;

public class CompletionTests10 extends AbstractJavaModelCompletionTests {
	static {
//		TESTS_NAMES = new String[]{"test0001_block_scope"};
	}
public CompletionTests10(String name) {
	super(name);
}
public void setUpSuite() throws Exception {
	if (COMPLETION_PROJECT == null)  {
		COMPLETION_PROJECT = setUpJavaProject("Completion", "10");
	} else {
		setUpProjectCompliance(COMPLETION_PROJECT, "10");
	}
	super.setUpSuite();
}
public static Test suite() {
	return buildModelTestSuite(CompletionTests10.class);
}
public void test0001_block_scope() throws JavaModelException {
	CompletionResult result = complete(
        "/Completion/src3/test0001/Test.java",
        "package test0001;\n" +
        "\n" +
        "public class Test {\n" +
        "	void x() {\n" +
        "		va\n" +
        "	}\n" +
        "}",
    	"va");

    assertResults(
            "expectedTypesSignatures=null\n" +
            "expectedTypesKeys=null",
            result.context);

	assertResults(
			"var[KEYWORD]{var, null, null, var, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED) + "}",
				result.proposals);
}
public void test0001a_block_scope_switch() throws JavaModelException {
	CompletionResult result = complete(
        "/Completion/src3/test0001/Test.java",
        "package test0001;\n" +
        "\n" +
        "public class Test {\n" +
        "	void x(int a) {\n" +
        "		switch(a) {\n" +
        "		case 1: 	va\n" +
        "		}\n" +
        "	}\n" +
        "}",
    	"va");

    assertResults(
            "expectedTypesSignatures=null\n" +
            "expectedTypesKeys=null",
            result.context);

	assertResults(
			"var[KEYWORD]{var, null, null, var, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED) + "}",
				result.proposals);
}
public void test0002_block_scope_final() throws JavaModelException {
	CompletionResult result = complete(
        "/Completion/src3/test0002/Test.java",
        "package test0002;\n" +
        "\n" +
        "public class Test {\n" +
        "	void x() {\n" +
        "		final va\n" +
        "	}\n" +
        "}",
    	"va");

    assertResults(
            "expectedTypesSignatures=null\n" +
            "expectedTypesKeys=null",
            result.context);

	assertResults(
			"var[KEYWORD]{var, null, null, var, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED) + "}",
				result.proposals);
}
public void test0003_inside_for() throws JavaModelException {
	CompletionResult result = complete(
        "/Completion/src3/test0003/Test.java",
        "package test0003;\n" +
        "\n" +
        "public class Test {\n" +
        "	void x() {\n" +
        "		for(va\n" +
        "	}\n" +
        "}",
    	"va");

    assertResults(
            "expectedTypesSignatures=null\n" +
            "expectedTypesKeys=null",
            result.context);

	assertResults(
			"var[KEYWORD]{var, null, null, var, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED) + "}",
				result.proposals);
}
public void test0004_inside_for_final() throws JavaModelException {
	CompletionResult result = complete(
        "/Completion/src3/test0004/Test.java",
        "package test0004;\n" +
        "\n" +
        "public class Test {\n" +
        "	void x() {\n" +
        "		for(final va\n" +
        "	}\n" +
        "}",
    	"va");

    assertResults(
            "expectedTypesSignatures=null\n" +
            "expectedTypesKeys=null",
            result.context);

	assertResults(
			"var[KEYWORD]{var, null, null, var, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED) + "}",
				result.proposals);
}
public void test0005_inside_try() throws JavaModelException {
	CompletionResult result = complete(
        "/Completion/src3/test0005/Test.java",
        "package test0005;\n" +
        "\n" +
        "public class Test {\n" +
        "	void x() {\n" +
        "		try(va\n" +
        "	}\n" +
        "}",
    	"va");

    assertResults(
            "expectedTypesSignatures=null\n" +
            "expectedTypesKeys=null",
            result.context);

	assertResults(
			"var[KEYWORD]{var, null, null, var, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED) + "}",
				result.proposals);
}
public void test0006_inside_try_final() throws JavaModelException {
	CompletionResult result = complete(
        "/Completion/src3/test0006/Test.java",
        "package test0006;\n" +
        "\n" +
        "public class Test {\n" +
        "	void x() {\n" +
        "		try(final va\n" +
        "	}\n" +
        "}",
    	"va");

    assertResults(
            "expectedTypesSignatures=null\n" +
            "expectedTypesKeys=null",
            result.context);

	assertResults(
			"var[KEYWORD]{var, null, null, var, null, " + (R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE + R_NON_RESTRICTED) + "}",
				result.proposals);
}

public void test0007_not_inside_expression() throws JavaModelException {
	CompletionResult result = complete(
        "/Completion/src3/test0007/Test.java",
        "package test0007;\n" +
        "\n" +
        "public class Test {\n" +
        "	void x() {\n" +
        "		int a = 2 + \n" +
        "	}\n" +
        "}",
    	"+ ");

    assertResults(
            "expectedTypesSignatures={S,I,J,F,D,C,B,Ljava.lang.String;}\n" + 
            "expectedTypesKeys={S,I,J,F,D,C,B,Ljava/lang/String;}",
            result.context);

	assertProposalCount("var[KEYWORD]", 0, 14, result);
}

public void test0008_not_in_class_scope() throws JavaModelException {
	CompletionResult result = complete(
        "/Completion/src3/test0008/Test.java",
        "package test0008;\n" +
        "\n" +
        "public class Test { \n" +

        "}",
    	"{");

    assertResults(
            "expectedTypesSignatures=null\n" +
            "expectedTypesKeys=null",
            result.context);

//{ObjectTeams: additional proposals "callin" and "team":
/* orig:
	assertProposalCount("var[KEYWORD]", 0, 21, result);
  :giro */
	assertProposalCount("var[KEYWORD]", 0, 23, result);
// SH}
}
	public void test0009_in_formal_param_lists() throws JavaModelException {
		CompletionResult result = complete(
	        "/Completion/src3/test0009/Test.java",
	        "package test0009;\n" +
	        "\n" +
	        "public class Test {\n" +
	        "	void x( ) {\n" +
	        "	}\n" +
	        "}",
	    	"x(");
	
	    assertResults(
	            "expectedTypesSignatures=null\n" +
	            "expectedTypesKeys=null",
	            result.context);
//{ObjectTeams: additional proposals "callin" and "team":
/* orig:
		assertProposalCount("var[KEYWORD]", 0, 15, result);
  :giro */
		assertProposalCount("var[KEYWORD]", 0, 17, result);
// SH}
	}

public void testbug_529556_missing_type_info_on_vars() throws JavaModelException {
	CompletionResult result = complete(
	        "/Completion/src3/test0001/Test.java",
	        "package test0001;\n" +
	        "\n" +
	        "public class Test {\n" +
	        "   private class Dummy {\n" +
	        "		public void a_method() {/n"+
	        "	}\n" +
	        "	void x() {\n" +
	        "		var x = new Dummy();\n" +
	        "		x.a\n" +
	        "	}\n" +
	        "}",
	    	"x.a");
		assertResults(
			"a_method[METHOD_REF]{a_method(), Ltest0001.Test$Dummy;, ()V, a_method, null, " + (R_DEFAULT + 30) + "}",
			result.proposals);
}
public void testBug532476a() throws JavaModelException {
	CompletionResult result = complete(
	        "/Completion/src3/p/X.java",
	        "package p;\n" +
	        "public class X {\n" +
	        "   public static void main(String[] args) {\n" +
	        "		var i_jk = 0;\n" + 
	        "		System.out.println(i_);/n"+
	        "	}\n" +
	        "}",
	    	"i_");
		assertResults(
			"i_jk[LOCAL_VARIABLE_REF]{i_jk, null, I, i_jk, null, " + (R_DEFAULT + 22) + "}",
			result.proposals);
}
public void testBug532476b() throws JavaModelException {
	CompletionResult result = complete(
	        "/Completion/src3/p/X.java",
	        "package p;\n" +
	        "public class X {\n" +
	        "   public static void main(String[] args) {\n" +
	        "		for (var i_jkl : args) {\n" + 
	        "			System.out.println(i_);/n"+
	        "		}\n" +
	        "	}\n" +
	        "}",
	    	"i_");
		assertResults(
			"i_jkl[LOCAL_VARIABLE_REF]{i_jkl, null, Ljava.lang.String;, i_jkl, null, "  + (R_DEFAULT + 22) + "}",
			result.proposals);
}
public void testBug532476c() throws JavaModelException {
	CompletionResult result = complete(
	        "/Completion/src3/p/X.java",
	        "package p;\n" +
	        "public class X {\n" +
	        "   public static void main(String[] args) {\n" +
	        "		for (var i_jkl = 0; i_ " +
	        "	}\n" +
	        "}",
	    	"i_");
		assertResults(
				"i_jkl[LOCAL_VARIABLE_REF]{i_jkl, null, I, i_jkl, null, " + (R_DEFAULT + 22) + "}",
			result.proposals);
}
public void testBug532476d() throws JavaModelException {
	CompletionResult result = complete(
	        "/Completion/src3/p/X.java",
	        "package p;\n" +
	        "public class X {\n" +
	        "   public static void main(String[] args) {\n" +
	        "		for (var i_jkl = 0; ; i_ " +
	        "	}\n" +
	        "}",
	    	"i_");
		assertResults(
				"i_jkl[LOCAL_VARIABLE_REF]{i_jkl, null, I, i_jkl, null, " + (R_DEFAULT + 22) + "}",
			result.proposals);
}
public void testBug532476e() throws JavaModelException {
	CompletionResult result = complete(
	        "/Completion/src3/p/X.java",
	        "package p;\n" +
	        "public class X {\n" +
	        "   public static void main(String[] args) {\n" +
	        "		for (var i_jkl : args) {\n" + 
	        "			System.out.println(i_jkl.fin);/n"+
	        "		}\n" +
	        "	}\n" +
	        "}",
	    	"i_jkl.fin");
		assertResults(
			"finalize[METHOD_REF]{finalize(), Ljava.lang.Object;, ()V, finalize, null, " + (R_DEFAULT + 30) + "}",
			result.proposals);
}
private void assertProposalCount(String proposal, int expectedCount, int expectedOtherCount, CompletionResult result) {
	String[] proposals = result.proposals.split("\n");
	long proposalsCount = Stream.of(proposals).filter(s -> s.startsWith(proposal)).count();
	assertEquals(
			"Unexpected occurrences of " + proposal + " - result was " + result.proposals,
			expectedCount, proposalsCount);

	long otherProposalsCount = proposals.length - proposalsCount;
	assertEquals(
			"Unexpected occurrences that were not " + proposal + " - result was " + result.proposals,
			expectedOtherCount, otherProposalsCount);
}

}
