/*******************************************************************************
 * Copyright (c) 2000, 2022 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.jdt.core.tests.compiler.parser;

import junit.framework.Test;

public class SelectionTest extends AbstractSelectionTest {
static {
//		TESTS_NUMBERS = new int[] { 53 };
}
public static Test suite() {
	return buildAllCompliancesTestSuite(SelectionTest.class);
}

public SelectionTest(String testName) {
	super(testName);
}
/*
 * Select superclass
 */
public void test01() {

	String str =
		"import java.io.*;							\n" +
		"											\n" +
		"public class X extends IOException {		\n" +
		"}											\n";

	String selectionStartBehind = "extends ";
	String selectionEndBehind = "IOException";

	String expectedCompletionNodeToString = "<SelectOnType:IOException>";
	String completionIdentifier = "IOException";
	String expectedUnitDisplayString =
		"import java.io.*;\n" +
		"public class X extends <SelectOnType:IOException> {\n" +
		"  public X() {\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "IOException";
	String testName = "<select superclass>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	checkDietParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select superinterface
 */
public void test02() {

	String str =
		"import java.io.*;													\n" +
		"																	\n" +
		"public class X extends IOException implements Serializable {		\n" +
		" int foo(){} 														\n" +
		"}																	\n";

	String selectionStartBehind = "implements ";
	String selectionEndBehind = "Serializable";

	String expectedCompletionNodeToString = "<SelectOnType:Serializable>";
	String completionIdentifier = "Serializable";
	String expectedUnitDisplayString =
		"import java.io.*;\n" +
		"public class X extends IOException implements <SelectOnType:Serializable> {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "Serializable";
	String testName = "<select superinterface>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	checkDietParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select qualified superclass
 */
public void test03() {

	String str =
		"public class X extends java.io.IOException {	\n" +
		"}												\n";

	String selectionStartBehind = "java.io.";
	String selectionEndBehind = "IOException";

	String expectedCompletionNodeToString = "<SelectOnType:java.io.IOException>";
	String completionIdentifier = "IOException";
	String expectedUnitDisplayString =
		"public class X extends <SelectOnType:java.io.IOException> {\n" +
		"  public X() {\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "java.io.IOException";
	String testName = "<select qualified superclass>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	checkDietParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select package from qualified superclass
 */
public void test04() {

	String str =
		"public class X extends java.io.IOException {	\n" +
		"}												\n";

	String selectionStartBehind = "java.";
	String selectionEndBehind = "java.io";

	String expectedCompletionNodeToString = "<SelectOnType:java.io>";
	String completionIdentifier = "io";
	String expectedUnitDisplayString =
		"public class X extends <SelectOnType:java.io> {\n" +
		"  public X() {\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "java.io.IOException";
	String testName = "<select package from qualified superclass>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	checkDietParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select message send
 */
public void test05() {

	String str =
		"public class X extends java.io.IOException {	\n" +
		"	int foo(){									\n" +
		"		System.out.println(\"hello\");			\n";

	String selectionStartBehind = "System.out.";
	String selectionEndBehind = "println";

	String expectedCompletionNodeToString = "<SelectOnMessageSend:System.out.println(\"hello\")>";
	String completionIdentifier = "println";
	String expectedUnitDisplayString =
		"public class X extends java.io.IOException {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"    <SelectOnMessageSend:System.out.println(\"hello\")>;\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "System.out.println(\"hello\")";
	String testName = "<select message send>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select message send with recovery before
 */
public void test06() {

	String str =
		"public class X extends 						\n" +
		"	int foo(){									\n" +
		"		System.out.println(\"hello\");			\n";

	String selectionStartBehind = "System.out.";
	String selectionEndBehind = "println";

	String expectedCompletionNodeToString = "<SelectOnMessageSend:System.out.println(\"hello\")>";
	String completionIdentifier = "println";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"    <SelectOnMessageSend:System.out.println(\"hello\")>;\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "System.out.println(\"hello\")";
	String testName = "<select message send with recovery before>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select message send with sibling method
 */
public void test07() {

	String str =
		"public class X extends 						\n" +
		"	int foo(){									\n" +
		"		this.bar(\"hello\");					\n" +
		"	int bar(String s){							\n" +
		"		return s.length();						\n"	+
		"	}											\n" +
		"}												\n";

	String selectionStartBehind = "this.";
	String selectionEndBehind = "this.bar";

	String expectedCompletionNodeToString = "<SelectOnMessageSend:this.bar(\"hello\")>";
	String completionIdentifier = "bar";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"    <SelectOnMessageSend:this.bar(\"hello\")>;\n" +
		"  }\n" +
		"  int bar(String s) {\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "this.bar(\"hello\")";
	String testName = "<select message send with sibling method>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select field reference
 */
public void test08() {

	String str =
		"public class X {		 						\n" +
		"	int num = 0;								\n" +
		"	int foo(){									\n" +
		"		int j = this.num;						\n" +
		"}												\n";

	String selectionStartBehind = "this.";
	String selectionEndBehind = "this.num";

	String expectedCompletionNodeToString = "<SelectionOnFieldReference:this.num>";
	String completionIdentifier = "num";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  int num;\n" +
		"  public X() {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"    int j = <SelectionOnFieldReference:this.num>;\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "this.num";
	String testName = "<select field reference>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select field reference with syntax errors
 */
public void test09() {

	String str =
		"public class X 		 						\n" +
		"	int num 									\n" +
		"	int foo(){									\n" +
		"		int j = this.num;						\n" +
		"}												\n";

	String selectionStartBehind = "this.";
	String selectionEndBehind = "this.num";

	String expectedCompletionNodeToString = "<SelectionOnFieldReference:this.num>";
	String completionIdentifier = "num";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  int num;\n" +
		"  public X() {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"    int j = <SelectionOnFieldReference:this.num>;\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "this.num";
	String testName = "<select field reference with syntax errors>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select field reference inside message receiver
 */
public void test10() {

	String str =
		"public class X {		 					\n" +
		"	X x; 									\n" +
		"	int foo(){								\n" +
		"		int j = this.x.foo();				\n" +
		"}											\n";

	String selectionStartBehind = "this.";
	String selectionEndBehind = "this.x";

	String expectedCompletionNodeToString = "<SelectionOnFieldReference:this.x>";
	String completionIdentifier = "x";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  X x;\n" +
		"  public X() {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"    int j = <SelectionOnFieldReference:this.x>;\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "this.x";
	String testName = "<select field reference inside message receiver>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select allocation
 */
public void test11() {

	String str =
		"public class X {		 					\n" +
		"	X(int i){}								\n" +
		"	int foo(){								\n" +
		"		int j = 0;							\n" +
		"		X x = new X(j);						\n" +
		"	}										\n" +
		"}											\n";

	String selectionStartBehind = "new ";
	String selectionEndBehind = "new X";

	String expectedCompletionNodeToString = "<SelectOnAllocationExpression:new X(j)>";
	String completionIdentifier = "X";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  X(int i) {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"    int j;\n" +
		"    X x = <SelectOnAllocationExpression:new X(j)>;\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "new X(j)";
	String testName = "<select allocation>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select qualified allocation
 */
public void test12() {

	String str =
		"public class X {		 					\n" +
		" 	class Y {								\n" +
		"		Y(int i){}							\n" +
		"	}										\n" +
		"	X(int i){}								\n" +
		"	int foo(){								\n" +
		"		int j = 0;							\n" +
		"		X x = new X(j);						\n" +
		"		x.new Y(1);							\n" +
		"	}										\n" +
		"}											\n";

	String selectionStartBehind = "x.new ";
	String selectionEndBehind = "x.new Y";

	String expectedCompletionNodeToString = "<SelectOnQualifiedAllocationExpression:x.new Y(1)>";
	String completionIdentifier = "Y";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  class Y {\n" +
		"    Y(int i) {\n" +
		"    }\n" +
		"  }\n" +
		"  X(int i) {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"    int j;\n" +
		"    X x;\n" +
		"    <SelectOnQualifiedAllocationExpression:x.new Y(1)>;\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "x.new Y(1)";
	String testName = "<select qualified allocation>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select qualified name reference receiver
 */
public void test13() {

	String str =
		"public class X {		 					\n" +
		"	int foo(){								\n" +
		"		java.lang.System.out.println();		\n" +
		"	}										\n" +
		"}											\n";

	String selectionStartBehind = "java.lang.";
	String selectionEndBehind = "java.lang.System";

	String expectedCompletionNodeToString = "<SelectOnName:java.lang.System>";
	String completionIdentifier = "System";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"    <SelectOnName:java.lang.System>;\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "java.lang.System.out";
	String testName = "<select qualified name receiver>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select qualified name reference
 */
public void test14() {

	String str =
		"public class X {		 					\n" +
		"	int foo(){								\n" +
		"		System sys = java.lang.System;		\n" +
		"	}										\n" +
		"}											\n";

	String selectionStartBehind = "java.lang.";
	String selectionEndBehind = "java.lang.System";

	String expectedCompletionNodeToString = "<SelectOnName:java.lang.System>";
	String completionIdentifier = "System";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"    System sys = <SelectOnName:java.lang.System>;\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "java.lang.System";
	String testName = "<select qualified name>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select variable type with modifier
 */
public void test15() {

	String str =
		"public class X {		 					\n" +
		"	int foo(){								\n" +
		"		final System sys = null;			\n" +
		"	}										\n" +
		"}											\n";

	String selectionStartBehind = "final ";
	String selectionEndBehind = "final System";

	String expectedCompletionNodeToString = "<SelectOnType:System>";
	String completionIdentifier = "System";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"    final <SelectOnType:System> sys;\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "System";
	String testName = "<select variable type with modifier>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select variable type
 */
public void test16() {

	String str =
		"public class X {		 					\n" +
		"	int foo(){								\n" +
		"		System sys = null;					\n" +
		"	}										\n" +
		"}											\n";

	String selectionStartBehind = "\n		";
	String selectionEndBehind = "\n		System";

	String expectedCompletionNodeToString = "<SelectOnType:System>";
	String completionIdentifier = "System";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"    <SelectOnType:System> sys;\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "System";
	String testName = "<select variable type>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select name
 */
public void test17() {

	String str =
		"public class X {		 					\n" +
		"	int foo(){								\n" +
		"		System 								\n" +
		"	}										\n" +
		"}											\n";

	String selectionStartBehind = "\n		";
	String selectionEndBehind = "\n		System";

	String expectedCompletionNodeToString = "<SelectOnName:System>";
	String completionIdentifier = "System";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"    <SelectOnName:System>;\n" +
		"  }\n" +
		"}\n";

	String expectedReplacedSource = "System";
	String testName = "<select name>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select anonymous type
 */
public void test18() {

	String str =
		"public class X {		 					\n" +
		"	int foo(){								\n" +
		"		new Object(){						\n" +
		"			int bar(){}						\n" +
		"		}									\n" +
		"	}										\n" +
		"}											\n";

	String selectionStartBehind = "new ";
	String selectionEndBehind = "new Object";

	String expectedCompletionNodeToString =
		"<SelectOnAllocationExpression:new Object() {\n" +
		"}>";
	String completionIdentifier = "Object";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"    <SelectOnAllocationExpression:new Object() {\n" +
		"    }>;\n" +
		"  }\n" +
		"}\n";

	String expectedReplacedSource = "new Object()";
	String testName = "<select anonymous type>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select cast type
 */
public void test19() {

	String str =
		"public class X {		 					\n" +
		"	Object foo(){							\n" +
		"		return (Object) this;				\n" +
		"		}									\n" +
		"	}										\n" +
		"}											\n";

	String selectionStartBehind = "return (";
	String selectionEndBehind = "return (Object";

	String expectedCompletionNodeToString = "<SelectOnType:Object>";
	String completionIdentifier = "Object";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  Object foo() {\n" +
		"    return (<SelectOnType:Object>) this;\n" +
		"  }\n" +
		"}\n";

	String expectedReplacedSource = "Object";
	String testName = "<select cast type>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select package
 */
public void test20() {

	String str =
		"package x.y.other;					\n" +
		"public class X {		 					\n" +
		"	int foo(){								\n" +
		"		}									\n" +
		"	}										\n" +
		"}											\n";

	String selectionStartBehind = "x.";
	String selectionEndBehind = "x.y";

	String expectedCompletionNodeToString = "<SelectOnPackage:x.y>";
	String completionIdentifier = "y";
	String expectedUnitDisplayString =
		"package <SelectOnPackage:x.y>;\n" +
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"  }\n" +
		"}\n";

	String expectedReplacedSource = "x.y.other";
	String testName = "<select package>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	checkDietParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select import
 */
public void test21() {

	String str =
		"import x.y.Other;					\n" +
		"public class X {		 					\n" +
		"	int foo(){								\n" +
		"		}									\n" +
		"	}										\n" +
		"}											\n";

	String selectionStartBehind = "y.";
	String selectionEndBehind = "y.Other";

	String expectedCompletionNodeToString = "<SelectOnImport:x.y.Other>";
	String completionIdentifier = "Other";
	String expectedUnitDisplayString =
		"import <SelectOnImport:x.y.Other>;\n" +
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"  }\n" +
		"}\n";

	String expectedReplacedSource = "x.y.Other";
	String testName = "<select import>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	checkDietParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select import on demand
 */
public void test22() {

	String str =
		"import x.y.other.*;					\n" +
		"public class X {		 					\n" +
		"	int foo(){								\n" +
		"		}									\n" +
		"	}										\n" +
		"}											\n";

	String selectionStartBehind = "y.";
	String selectionEndBehind = "y.other";

	String expectedCompletionNodeToString = "<SelectOnImport:x.y.other>";
	String completionIdentifier = "other";
	String expectedUnitDisplayString =
		"import <SelectOnImport:x.y.other>;\n" +
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"  }\n" +
		"}\n";

	String expectedReplacedSource = "x.y.other";
	String testName = "<select import on demand>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	checkDietParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select array initializer type
 */
public void test23() {

	String str =
		"public class X {		 					\n" +
		"	int foo(){								\n" +
		"		String[] p = new String[]{\"Left\"};\n" +
//		"		}									\n" +
		"	}										\n" +
		"}											\n";

	String selectionStartBehind = "new ";
	String selectionEndBehind = "new String";
	String expectedCompletionNodeToString = "<SelectOnType:String>";
	String completionIdentifier = "String";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  int foo() {\n" +
		"    String[] p = <SelectOnType:String>;\n" +
		"  }\n" +
		"}\n";

	String expectedReplacedSource = "String";
	String testName = "<select array initializer type>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select nested type superclass with syntax error behind
 */
public void test24() {

	String str =
		"public class G {					\n" +
		"	void foo() {					\n" +
		"		class X {					\n" +
		"			class Y extends G {		\n" +
		"				int foo()			\n" +
		"			}						\n" +
		"		}							\n" +
		"	}								\n" +
		"}									\n";

	String selectionStartBehind = "extends ";
	String selectionEndBehind = "extends G";

	String expectedCompletionNodeToString = "<SelectOnType:G>";

	String completionIdentifier = "G";
	String expectedUnitDisplayString =
		"public class G {\n" +
		"  public G() {\n" +
		"  }\n" +
		"  void foo() {\n" +
		"    class X {\n" +
		"      class Y extends <SelectOnType:G> {\n" +
		"        Y() {\n" +
		"        }\n" +
		"        int foo() {\n" +
		"        }\n" +
		"      }\n" +
		"      X() {\n" +
		"      }\n" +
		"    }\n" +
		"  }\n" +
		"}\n";

	String expectedReplacedSource = "G";
	String testName = "<select nested type superclass>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select super
 */
public void test25() {

	String str =
		"public class G {					\n" +
		"	Object foo() {					\n" +
		"		return super.foo();			\n" +
		"	}								\n" +
		"}									\n";

	String selectionStartBehind = "return ";
	String selectionEndBehind = "return super";

	String expectedCompletionNodeToString = "<SelectOnSuper:super>";

	String completionIdentifier = "super";
	String expectedUnitDisplayString =
		"public class G {\n" +
		"  public G() {\n" +
		"  }\n" +
		"  Object foo() {\n" +
		"    return <SelectOnSuper:super>;\n" +
		"  }\n" +
		"}\n";

	String expectedReplacedSource = "super";
	String testName = "<select super>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select qualified super
 */
public void test26() {

	String str =
		"public class G {						\n" +
		"	Object foo() {						\n" +
		"		new X(){						\n" +
		"			Object bar(){				\n" +
		"				return G.super.foo();	\n" +
		"			}							\n" +
		"		}								\n" +
		"	}									\n" +
		"}										\n";

	String selectionStartBehind = "G.";
	String selectionEndBehind = "G.super";

	String expectedCompletionNodeToString = "<SelectOnQualifiedSuper:G.super>";

	String completionIdentifier = "super";
	String expectedUnitDisplayString =
		"public class G {\n" +
		"  public G() {\n" +
		"  }\n" +
		"  Object foo() {\n" +
		"    new X() {\n" +
		"      Object bar() {\n" +
		"        return <SelectOnQualifiedSuper:G.super>;\n" +
		"      }\n" +
		"    };\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "G.super";
	String testName = "<select qualified super>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select super constructor call
 */
public void test27() {

	String str =
		"public class G {					\n" +
		"	G() {							\n" +
		"		super();					\n" +
		"	}								\n" +
		"}									\n";

	String selectionStartBehind = "\n\t\t";
	String selectionEndBehind = "super";

	String expectedCompletionNodeToString = "<SelectOnExplicitConstructorCall:super()>;";

	String completionIdentifier = "super";
	String expectedUnitDisplayString =
		"public class G {\n" +
		"  G() {\n" +
		"    <SelectOnExplicitConstructorCall:super()>;\n" +
		"  }\n" +
		"}\n";

	String expectedReplacedSource = "super()";
	String testName = "<select super constructor call>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select qualified super constructor call
 */
public void test28() {

	String str =
		"public class G {						\n" +
		"	class M {}							\n" +
		"	static Object foo() {				\n" +
		"		class X extends M {				\n" +
		"			X (){						\n" +
		"				new G().super();		\n" +
		"			}							\n" +
		"		}								\n" +
		"	}									\n" +
		"}										\n";

	String selectionStartBehind = "new G().";
	String selectionEndBehind = "new G().super";

	String expectedCompletionNodeToString = "<SelectOnExplicitConstructorCall:new G().super()>;";

	String completionIdentifier = "super";
	String expectedUnitDisplayString =
		"public class G {\n" +
		"  class M {\n" +
		"    M() {\n" +
		"    }\n" +
		"  }\n" +
		"  public G() {\n" +
		"  }\n" +
		"  static Object foo() {\n" +
		"    class X extends M {\n" +
		"      X() {\n" +
		"        <SelectOnExplicitConstructorCall:new G().super()>;\n" +
		"      }\n" +
		"    }\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "new G().super()";
	String testName = "<select qualified super constructor call>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select qualified super constructor call with arguments
 */
public void test29() {

	String str =
		"public class G {								\n" +
		"	class M {}									\n" +
		"	static Object foo() {						\n" +
		"		class X extends M {						\n" +
		"			X (){								\n" +
		"				new G().super(23 + \"hello\");	\n" +
		"			}									\n" +
		"		}										\n" +
		"	}											\n" +
		"}												\n";

	String selectionStartBehind = "new G().";
	String selectionEndBehind = "new G().super";

	String expectedCompletionNodeToString = "<SelectOnExplicitConstructorCall:new G().super((23 + \"hello\"))>;";

	String completionIdentifier = "super";
	String expectedUnitDisplayString =
		"public class G {\n" +
		"  class M {\n" +
		"    M() {\n" +
		"    }\n" +
		"  }\n" +
		"  public G() {\n" +
		"  }\n" +
		"  static Object foo() {\n" +
		"    class X extends M {\n" +
		"      X() {\n" +
		"        <SelectOnExplicitConstructorCall:new G().super((23 + \"hello\"))>;\n" +
		"      }\n" +
		"    }\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "new G().super(23 + \"hello\")";
	String testName = "<select qualified super constructor call with arguments>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select super constructor call with arguments
 */
public void test30() {

	String str =
		"public class G {					\n" +
		"	G() {							\n" +
		"		super(new G());				\n" +
		"	}								\n" +
		"}									\n";

	String selectionStartBehind = "\n\t\t";
	String selectionEndBehind = "super";

	String expectedCompletionNodeToString = "<SelectOnExplicitConstructorCall:super(new G())>;";

	String completionIdentifier = "super";
	String expectedUnitDisplayString =
		"public class G {\n" +
		"  G() {\n" +
		"    <SelectOnExplicitConstructorCall:super(new G())>;\n" +
		"  }\n" +
		"}\n";

	String expectedReplacedSource = "super(new G())";
	String testName = "<select super constructor call with arguments>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Regression test for 1FVQ0LK
 */
public void test31() {

	String str =
		"class X {							\n" +
		"	Y f;							\n" +
		"	void foo() {					\n" +
		"		new Bar(fred());			\n" +
		"		Z z= new Z();				\n" +
		"	}								\n" +
		"}									\n";

	String selectionStartBehind = "\n\t";
	String selectionEndBehind = "Y";

	String expectedCompletionNodeToString = "<SelectOnType:Y>";

	String completionIdentifier = "Y";
	String expectedUnitDisplayString =
		"class X {\n" +
		"  <SelectOnType:Y> f;\n" +
		"  X() {\n" +
		"  }\n" +
		"  void foo() {\n" +
		"  }\n" +
		"}\n";

	String expectedReplacedSource = "Y";
	String testName = "<regression test for 1FVQ0LK>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	checkDietParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Regression test for 1FWT4AJ: ITPCOM:WIN98 - SelectionParser produces duplicate type declaration
 */
public void test32() {

	String str =
		"package search;												\n"+
		"import java.io.*;												\n"+
		"public class PhraseQuery {										\n"+
		"	public boolean containsPhrase(){							\n"+
		"		try {													\n"+
		"				char currentChar = \"hello\".toLowerCase()		\n"+
		"	}															\n"+
		"}																\n";

	String selectionStartBehind = "\"hello\".";
	String selectionEndBehind = "\"hello\".toLowerCase";

	String expectedCompletionNodeToString = "<SelectOnMessageSend:\"hello\".toLowerCase()>";

	String completionIdentifier = "toLowerCase";
	String expectedUnitDisplayString =
		"package search;\n" +
		"import java.io.*;\n" +
		"public class PhraseQuery {\n" +
		"  public PhraseQuery() {\n" +
		"  }\n" +
		"  public boolean containsPhrase() {\n" +
		"    {\n" +
		"      char currentChar = <SelectOnMessageSend:\"hello\".toLowerCase()>;\n" +
		"    }\n" +
		"  }\n" +
		"}\n";

	String expectedReplacedSource = "\"hello\".toLowerCase()";
	String testName = "<1FWT4AJ: ITPCOM:WIN98 - SelectionParser produces duplicate type declaration>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Regression test for 1G4CLZM: ITPJUI:WINNT - 'Import Selection' - Set not found
 */
public void test33() {

	String str =
		"	import java.util.AbstractMap;				\n"+
		"	public class c4 extends AbstractMap {		\n"+
		"		/**										\n"+
		"		 * @see AbstractMap#entrySet			\n"+
		"		 */										\n"+
		"		public Set entrySet() {					\n"+
		"			return null;						\n"+
		"		}										\n"+
		"	}											\n";

	String selectionStartBehind = "\n\t\tpublic ";
	String selectionEndBehind = "public Set";

	String expectedCompletionNodeToString = "<SelectOnType:Set>";

	String completionIdentifier = "Set";
	String expectedUnitDisplayString =
		"import java.util.AbstractMap;\n" +
		"public class c4 extends AbstractMap {\n" +
		"  public c4() {\n" +
		"  }\n" +
		"  public <SelectOnType:Set> entrySet() {\n" +
		"  }\n" +
		"}\n";

	String expectedReplacedSource = "Set";
	String testName = "<1G4CLZM: ITPJUI:WINNT - 'Import Selection' - Set not found>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	checkDietParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Regression test for 1GB99S3: ITPJUI:WINNT - SH: NPE in editor while getting hover help
 */
public void test34() {

	String str =
		"public class X {							\n"+
		"	public int foo() {						\n"+
		"		Object[] array = new Object[0];		\n"+
		"		return array.length;				\n"+
		"	}										\n"+
		"}											\n";

	String selectionStartBehind = "\n\t\treturn ";
	String selectionEndBehind = "array.length";

	String expectedCompletionNodeToString = NONE;

	String completionIdentifier = NONE;
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  public int foo() {\n" +
		"    Object[] array;\n" +
		"    return array.length;\n" +
		"  }\n" +
		"}\n";

	String expectedReplacedSource = NONE;
	String testName = "<1GB99S3: ITPJUI:WINNT - SH: NPE in editor while getting hover help>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}

/*
 * Select this constructor call
 */
public void test35() {

	String str =
		"public class G {					\n" +
		"	G() {							\n" +
		"	}								\n" +
		"	G(int x) {						\n" +
		"		this();						\n" +
		"	}								\n" +
		"}									\n";

	String selectionStartBehind = "\n\t\t";
	String selectionEndBehind = "this";

	String expectedCompletionNodeToString = "<SelectOnExplicitConstructorCall:this()>;";

	String completionIdentifier = "this";
	String expectedUnitDisplayString =
		"public class G {\n" +
		"  G() {\n" +
		"  }\n" +
		"  G(int x) {\n" +
		"    <SelectOnExplicitConstructorCall:this()>;\n" +
		"  }\n" +
		"}\n";

	String expectedReplacedSource = "this()";
	String testName = "<select this constructor call>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}

/*
 * Select qualified this constructor call
 */
public void test36() {

	String str =
		"public class G {						\n" +
		"	static Object foo() {				\n" +
		"		class X {						\n" +
		"			X (){						\n" +
		"			}							\n" +
		"			X (int x){					\n" +
		"				new G().this();			\n" +
		"			}							\n" +
		"		}								\n" +
		"	}									\n" +
		"}										\n";

	String selectionStartBehind = "new G().";
	String selectionEndBehind = "new G().this";

	String expectedCompletionNodeToString = "<SelectOnExplicitConstructorCall:new G().this()>;";

	String completionIdentifier = "this";
	String expectedUnitDisplayString =
		"public class G {\n" +
		"  public G() {\n" +
		"  }\n" +
		"  static Object foo() {\n" +
		"    class X {\n" +
		"      X() {\n" +
		"        super();\n"+
		"      }\n" +
		"      X(int x) {\n" +
		"        <SelectOnExplicitConstructorCall:new G().this()>;\n" +
		"      }\n" +
		"    }\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "new G().this()";
	String testName = "<select qualified this constructor call>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select qualified this constructor call with arguments
 */
public void test37() {

	String str =
		"public class G {								\n" +
		"	static Object foo() {						\n" +
		"		class X {								\n" +
		"			X (){								\n" +
		"			}									\n" +
		"			X (int x){							\n" +
		"				new G().this(23 + \"hello\");	\n" +
		"			}									\n" +
		"		}										\n" +
		"	}											\n" +
		"}												\n";

	String selectionStartBehind = "new G().";
	String selectionEndBehind = "new G().this";

	String expectedCompletionNodeToString = "<SelectOnExplicitConstructorCall:new G().this((23 + \"hello\"))>;";

	String completionIdentifier = "this";
	String expectedUnitDisplayString =
		"public class G {\n" +
		"  public G() {\n" +
		"  }\n" +
		"  static Object foo() {\n" +
		"    class X {\n" +
		"      X() {\n" +
		"        super();\n"+
		"      }\n" +
		"      X(int x) {\n" +
		"        <SelectOnExplicitConstructorCall:new G().this((23 + \"hello\"))>;\n" +
		"      }\n" +
		"    }\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "new G().this(23 + \"hello\")";
	String testName = "<select qualified this constructor call with arguments>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Select this constructor call with arguments
 */
public void test38() {

	String str =
		"public class G {					\n" +
		"	G() {							\n" +
		"		this(new G());				\n" +
		"	}								\n" +
		"}									\n";

	String selectionStartBehind = "\n\t\t";
	String selectionEndBehind = "this";

	String expectedCompletionNodeToString = "<SelectOnExplicitConstructorCall:this(new G())>;";

	String completionIdentifier = "this";
	String expectedUnitDisplayString =
		"public class G {\n" +
		"  G() {\n" +
		"    <SelectOnExplicitConstructorCall:this(new G())>;\n" +
		"  }\n" +
		"}\n";

	String expectedReplacedSource = "this(new G())";
	String testName = "<select this constructor call with arguments>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * bugs 3293 search does not work in inner class (1GEUQHJ)
 */
public void test39() {

	String str =
		"public class X {                \n" +
		"  Object hello = new Object(){  \n" +
		"    public void foo(String s){  \n" +
		"      s.length();               \n" +
		"    }                           \n" +
		"  };                            \n" +
		"}								 \n";

	String selectionStartBehind = "s.";
	String selectionEndBehind = "length";

	String expectedCompletionNodeToString = "<SelectOnMessageSend:s.length()>";

	String completionIdentifier = "length";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  Object hello = new Object() {\n" +
		"    public void foo(String s) {\n" +
		"      <SelectOnMessageSend:s.length()>;\n" +
		"    }\n" +
		"  };\n" +
		"  public X() {\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "s.length()";
	String testName = "<select message send in anonymous class>";

	int selectionStart = str.indexOf(selectionStartBehind) + selectionStartBehind.length();
	int selectionEnd = str.indexOf(selectionEndBehind) + selectionEndBehind.length() - 1;

	checkDietParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}

/*
 * bugs 3229 OpenOnSelection - strange behaviour of code resolve (1GAVL08)
 */
public void test40() {

	String str =
		"public class X {                \n" +
		"  Object                        \n" +
		"}								 \n";

	String selection = "Object";

	String expectedCompletionNodeToString = "<SelectOnType:Object>";

	String completionIdentifier = "Object";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  <SelectOnType:Object>;\n" +
		"  public X() {\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "Object";
	String testName = "<select fake field>";

	int selectionStart = str.indexOf(selection);
	int selectionEnd = str.indexOf(selection) + selection.length() - 1;

	checkDietParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * bugs 11475 selection on local name.
 */
public void test41() {

	String str =
		"public class X {                \n" +
		"  public void foo(){                   \n" +
		"    Object var;              \n" +
		"  }                             \n" +
		"}								 \n";

	String selection = "var";

	String expectedCompletionNodeToString = "<SelectionOnLocalName:Object var>;";

	String completionIdentifier = "var";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  public void foo() {\n" +
		"    <SelectionOnLocalName:Object var>;\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "var";
	String testName = "<select local name>";

	int selectionStart = str.indexOf(selection);
	int selectionEnd = str.indexOf(selection) + selection.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * bugs 11475 selection on argument name.
 */
public void test42() {

	String str =
		"public class X {                \n" +
		"  public void foo(Object var){          \n" +
		"  }                             \n" +
		"}								 \n";

	String selection = "var";

	String expectedCompletionNodeToString = "<SelectionOnArgumentName:Object var>";

	String completionIdentifier = "var";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  public void foo(<SelectionOnArgumentName:Object var>) {\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "var";
	String testName = "<select argument name>";

	int selectionStart = str.indexOf(selection);
	int selectionEnd = str.indexOf(selection) + selection.length() - 1;

	checkDietParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * bugs 11475 selection on argument name inside catch statement.
 */
public void test43() {

	String str =
		"public class X {                \n" +
		"  public void foo(){                   \n" +
		"    try{              \n" +
		"    }catch(Object var){}\n" +
		"  }                             \n" +
		"}								 \n";

	String selection = "var";

	String expectedCompletionNodeToString = "<SelectionOnArgumentName:Object var>";

	String completionIdentifier = "var";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  public void foo() {\n" +
		"    <SelectionOnArgumentName:Object var>;\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "var";
	String testName = "<select argument name inside catch statement>";

	int selectionStart = str.indexOf(selection);
	int selectionEnd = str.indexOf(selection) + selection.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * bugs 15430
 */
public void test44() {

	String str =
		"public class X {                \n" +
		"  String x = super.foo()  \n" +
		"}								 \n";

	String selection = "super";

	String expectedCompletionNodeToString = "<SelectOnSuper:super>";

	String completionIdentifier = "super";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  String x = <SelectOnSuper:super>;\n" +
		"  public X() {\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "super";
	String testName = "<select super in field initializer>";

	int selectionStart = str.indexOf(selection);
	int selectionEnd = str.indexOf(selection) + selection.length() - 1;

	checkDietParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * bugs 14468
 */
public void test45() {

	String str =
		"public class X {                \n" +
		"  void foo() {\n" +
		"    if(x instanceof Object s){\n" +
		"    }\n" +
		"  }  \n" +
		"}								 \n";

	String selection = "Object";

	String expectedCompletionNodeToString = "<SelectOnType:Object>";

	String completionIdentifier = "Object";
	String expectedUnitDisplayString =
		"public class X {\n"+
		"  public X() {\n"+
		"  }\n"+
		"  void foo() {\n" +
		"    if ((x instanceof <SelectOnType:Object> s))\n" +
		"        {\n" +
		"        }\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "Object";
	String testName = "<select inside instanceof statement>";

	int selectionStart = str.indexOf(selection);
	int selectionEnd = str.indexOf(selection) + selection.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}

/*
 * bugs 14468
 */
public void test46() {

	String str =
		"public class X {                \n" +
		"  void foo() {\n" +
		"    y = x instanceof Object;\n" +
		"  }  \n" +
		"}								 \n";

	String selection = "Object";

	String expectedCompletionNodeToString = "<SelectOnType:Object>";

	String completionIdentifier = "Object";
	String expectedUnitDisplayString =
		"public class X {\n"+
		"  public X() {\n"+
		"  }\n"+
		"  void foo() {\n"+
		"    y = (x instanceof <SelectOnType:Object>);\n"+
		"  }\n"+
		"}\n";
	String expectedReplacedSource = "Object";
	String testName = "<select inside instanceof statement>";

	int selectionStart = str.indexOf(selection);
	int selectionEnd = str.indexOf(selection) + selection.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * bugs 14468
 */
public void test47() {

	String str =
		"public class X {                \n" +
		"  void foo() {\n" +
		"   boolean y = x instanceof Object;\n" +
		"  }  \n" +
		"}								 \n";

	String selection = "Object";

	String expectedCompletionNodeToString = "<SelectOnType:Object>";

	String completionIdentifier = "Object";
	String expectedUnitDisplayString =
		"public class X {\n"+
		"  public X() {\n"+
		"  }\n"+
		"  void foo() {\n"+
		"    boolean y = (x instanceof <SelectOnType:Object>);\n"+
		"  }\n"+
		"}\n";
	String expectedReplacedSource = "Object";
	String testName = "<select inside instanceof statement>";

	int selectionStart = str.indexOf(selection);
	int selectionEnd = str.indexOf(selection) + selection.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * bugs 14468
 */
public void test48() {

	String str =
		"public class X {                \n" +
		"  boolean y = x instanceof Object;\n" +
		"}								 \n";

	String selection = "Object";

	String expectedCompletionNodeToString = "<SelectOnType:Object>";

	String completionIdentifier = "Object";
	String expectedUnitDisplayString =
		"public class X {\n"+
		"  boolean y = (x instanceof <SelectOnType:Object>);\n"+
		"  public X() {\n"+
		"  }\n"+
		"}\n";
	String expectedReplacedSource = "Object";
	String testName = "<select inside instanceof statement>";

	int selectionStart = str.indexOf(selection);
	int selectionEnd = str.indexOf(selection) + selection.length() - 1;

	checkDietParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * bugs 28064
 */
public void test49() {

	String str =
		"public class X {                \n" +
		"  X x = new X(){}\n" +
		"}								 \n";

	String selection = "X";

	String expectedCompletionNodeToString = "<SelectOnAllocationExpression:new X() {\n" +
											"}>";

	String completionIdentifier = "X";
	String expectedUnitDisplayString =
		"public class X {\n"+
		"  X x = <SelectOnAllocationExpression:new X() {\n" +
		"  }>;\n"+
		"  public X() {\n"+
		"  }\n"+
		"}\n";
	String expectedReplacedSource = "new X()";
	String testName = "<select anonymous type>";

	int selectionStart = str.lastIndexOf(selection);
	int selectionEnd = str.lastIndexOf(selection) + selection.length() - 1;

	checkDietParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * bugs https://bugs.eclipse.org/bugs/show_bug.cgi?id=52422
 */
public void test50() {

	String str =
		"public class X {                \n" +
		"  void foo() {\n" +
		"    new Object(){\n" +
		"      void bar(){\n" +
		"        bar2();\n" +
		"      }\n" +
		"      void bar2() {\n" +
		"      }\n" +
		"    }\n" +
		"  }  \n" +
		"}								 \n";

	String selection = "bar2";

	String expectedCompletionNodeToString = "<SelectOnMessageSend:bar2()>";

	String completionIdentifier = "bar2";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  void foo() {\n" +
		"    new Object() {\n" +
		"      void bar() {\n" +
		"        <SelectOnMessageSend:bar2()>;\n" +
		"      }\n" +
		"      void bar2() {\n" +
		"      }\n" +
		"    };\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "bar2()";
	String testName = "<select inside anonymous type>";

	int selectionStart = str.indexOf(selection);
	int selectionEnd = str.indexOf(selection) + selection.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * bugs https://bugs.eclipse.org/bugs/show_bug.cgi?id=52422
 */
public void test51() {

	String str =
		"public class X {                \n" +
		"  void foo() {\n" +
		"    new Object(){\n" +
		"      void foo0(){\n" +
		"        new Object(){\n" +
		"          void bar(){\n" +
		"            bar2();\n" +
		"          }\n" +
		"          void bar2() {\n" +
		"          }\n" +
		"        }\n" +
		"      }\n" +
		"    }\n" +
		"  }\n" +
		"}								 \n";

	String selection = "bar2";

	String expectedCompletionNodeToString = "<SelectOnMessageSend:bar2()>";

	String completionIdentifier = "bar2";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  void foo() {\n" +
		"    new Object() {\n" +
		"      void foo0() {\n" +
		"        new Object() {\n" +
		"          void bar() {\n" +
		"            <SelectOnMessageSend:bar2()>;\n" +
		"          }\n" +
		"          void bar2() {\n" +
		"          }\n" +
		"        };\n" +
		"      }\n" +
		"    };\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "bar2()";
	String testName = "<select inside anonymous type>";

	int selectionStart = str.indexOf(selection);
	int selectionEnd = str.indexOf(selection) + selection.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * bugs https://bugs.eclipse.org/bugs/show_bug.cgi?id=52422
 */
public void test52() {

	String str =
		"public class X {                \n" +
		"  void foo() {\n" +
		"    new Object(){\n" +
		"      void foo0(){\n" +
		"        new Object(){\n" +
		"          void bar(){\n" +
		"            bar2();\n" +
		"          }\n" +

		"        }\n" +
		"      }\n" +
		"      void bar2() {\n" +
		"      }\n" +
		"    }\n" +
		"  }\n" +
		"}								 \n";

	String selection = "bar2";

	String expectedCompletionNodeToString = "<SelectOnMessageSend:bar2()>";

	String completionIdentifier = "bar2";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  void foo() {\n" +
		"    new Object() {\n" +
		"      void foo0() {\n" +
		"        new Object() {\n" +
		"          void bar() {\n" +
		"            <SelectOnMessageSend:bar2()>;\n" +
		"          }\n" +
		"        };\n" +
		"      }\n" +
		"      void bar2() {\n" +
		"      }\n" +
		"    };\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "bar2()";
	String testName = "<select inside anonymous type>";

	int selectionStart = str.indexOf(selection);
	int selectionEnd = str.indexOf(selection) + selection.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
public void test53() {

	String str =
		"public class X {                \n" +
		"  void foo(String[] stringArray) {\n" +
		"    for(String string2 : stringArray);\n" +
		"  }\n" +
		"}								 \n";

	String selection = "string2";

	String expectedCompletionNodeToString = "<SelectionOnLocalName:String string2>;";

	String completionIdentifier = "string2";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  void foo(String[] stringArray) {\n" +
		"    for (<SelectionOnLocalName:String string2> : stringArray) \n" +
		"      ;\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "string2";
	String testName = "<select>";

	int selectionStart = str.indexOf(selection);
	int selectionEnd = str.indexOf(selection) + selection.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84001
public void test54() {

	String str =
		"public class X {                \n" +
		"  void foo() {\n" +
		"    new Test.Sub();\n" +
		"  }\n" +
		"}								 \n";

	String selection = "Test";

	String expectedCompletionNodeToString = "<SelectOnType:Test>";

	String completionIdentifier = "Test";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  void foo() {\n" +
		"    new <SelectOnType:Test>();\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "Test";
	String testName = "<select>";

	int selectionStart = str.indexOf(selection);
	int selectionEnd = str.indexOf(selection) + selection.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84001
public void test55() {

	String str =
		"public class X {                \n" +
		"  void foo() {\n" +
		"    new Test.Sub();\n" +
		"  }\n" +
		"}								 \n";

	String selection = "Sub";

	String expectedCompletionNodeToString = "<SelectOnAllocationExpression:new Test.Sub()>";

	String completionIdentifier = "Sub";
	String expectedUnitDisplayString =
		"public class X {\n" +
		"  public X() {\n" +
		"  }\n" +
		"  void foo() {\n" +
		"    <SelectOnAllocationExpression:new Test.Sub()>;\n" +
		"  }\n" +
		"}\n";
	String expectedReplacedSource = "new Test.Sub()";
	String testName = "<select>";

	int selectionStart = str.indexOf(selection);
	int selectionEnd = str.indexOf(selection) + selection.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=291040
public void _test56() {

	String str =
			"class X {\n" +
			"    void foo() {\n" +
			"        new X(null) {\n" +
			"            void goo() {\n" +
			"                new X(zoo()) {\n" +
			"                    void voo() {\n" +
			"                    }\n" +
			"                };\n" +
			"            }\n" +
			"\n" +
			"            Object zoo() {\n" +
			"                return null;\n" +
			"            }\n" +
			"        };\n" +
			"    }\n" +
			"\n" +
			"    X(Object k) {\n" +
			"    }\n" +
			"}\n";

	String selection = "zoo";

	String expectedCompletionNodeToString = "<SelectOnMessageSend:zoo()>";

	String completionIdentifier = "zoo";
	String expectedUnitDisplayString =
			"class X {\n" +
			"  void foo() {\n" +
			"    new X(null) {\n" +
			"      void goo() {\n" +
			"        new X(<SelectOnMessageSend:zoo()>) {\n" +
			"          void voo() {\n" +
			"          }\n" +
			"        };\n" +
			"      }\n" +
			"      Object zoo() {\n" +
			"      }\n" +
			"    };\n" +
			"  }\n" +
			"  X(Object k) {\n" +
			"  }\n" +
			"}\n";
	String expectedReplacedSource = "zoo()";
	String testName = "<select>";

	int selectionStart = str.indexOf(selection);
	int selectionEnd = str.indexOf(selection) + selection.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
/*
 * Test that an {@code instanceof} expression for an object field
 * doesn't result in a bad selection when nested in a method invocation.
 * See: https://github.com/eclipse-jdt/eclipse.jdt.core/issues/848
 */
public void testInstanceOfFieldGh848() {
	String str =
		"public class X {                     \n" +
		"    public Object o = new Object();\n" +
		"    public static void bar() {\n" +
		"        Test x = new Test();\n" +
		"        foo(x.o instanceof Object);\n" +
		"    }\n" +
		"    private static void foo(boolean b) {\n" +
		"    }" +
		"}								     \n";

	String selection = "foo";

	String expectedCompletionNodeToString = "<SelectOnMessageSend:foo((x.o instanceof Object))>";

	String completionIdentifier = "foo";
	String expectedUnitDisplayString =
			"public class X {\n" +
			"  public Object o;\n" +
			"  public X() {\n" +
			"  }\n" +
			"  public static void bar() {\n" +
			"    Test x;\n" +
			"    <SelectOnMessageSend:foo((x.o instanceof Object))>;\n" +
			"  }\n" +
			"  private static void foo(boolean b) {\n" +
			"  }\n" +
			"}\n";
	String expectedReplacedSource = "foo(x.o instanceof Object)";
	String testName = "<select inside instanceof statement>";

	int selectionStart = str.indexOf(selection);
	int selectionEnd = str.indexOf(selection) + selection.length() - 1;

	this.checkMethodParse(
		str.toCharArray(),
		selectionStart,
		selectionEnd,
		expectedCompletionNodeToString,
		expectedUnitDisplayString,
		completionIdentifier,
		expectedReplacedSource,
		testName);
}
}
