Path: blob/master/test/langtools/jdk/jshell/ForwardReferenceImportTest.java
40931 views
/*1* Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/*24* @test 817323225* @summary Test of forward referencing of snippets (related to import).26* @build KullaTesting TestingInputStream27* @run testng ForwardReferenceImportTest28*/2930import jdk.jshell.Snippet;31import jdk.jshell.DeclarationSnippet;32import org.testng.annotations.Test;3334import static jdk.jshell.Snippet.Status.*;3536@Test37public class ForwardReferenceImportTest extends KullaTesting {3839public void testImportDeclare() {40Snippet singleImport = importKey(assertEval("import java.util.List;", added(VALID)));41Snippet importOnDemand = importKey(assertEval("import java.util.*;", added(VALID)));42Snippet singleStaticImport = importKey(assertEval("import static java.lang.Math.abs;", added(VALID)));43Snippet staticImportOnDemand = importKey(assertEval("import static java.lang.Math.*;", added(VALID)));44assertEval("import java.util.List; //again",45ste(MAIN_SNIPPET, VALID, VALID, false, null),46ste(singleImport, VALID, OVERWRITTEN, false, MAIN_SNIPPET));47assertEval("import java.util.*; //again",48ste(MAIN_SNIPPET, VALID, VALID, false, null),49ste(importOnDemand, VALID, OVERWRITTEN, false, MAIN_SNIPPET));50assertEval("import static java.lang.Math.abs; //again",51ste(MAIN_SNIPPET, VALID, VALID, false, null),52ste(singleStaticImport, VALID, OVERWRITTEN, false, MAIN_SNIPPET));53assertEval("import static java.lang.Math.*; //again",54ste(MAIN_SNIPPET, VALID, VALID, false, null),55ste(staticImportOnDemand, VALID, OVERWRITTEN, false, MAIN_SNIPPET));56assertActiveKeys();57}5859public void testForwardSingleImportMethodToMethod() {60DeclarationSnippet string = methodKey(assertEval("String string() { return format(\"string\"); }",61added(RECOVERABLE_DEFINED)));62assertUnresolvedDependencies1(string, RECOVERABLE_DEFINED, "method format(java.lang.String)");63assertEvalUnresolvedException("string();", "string", 1, 0);64assertEval("import static java.lang.String.format;",65added(VALID),66ste(string, RECOVERABLE_DEFINED, VALID, false, null));67assertEval("string();", "\"string\"");6869assertEval("double format(String s) { return 0; }",70DiagCheck.DIAG_OK,71DiagCheck.DIAG_ERROR,72added(VALID),73ste(string, VALID, RECOVERABLE_DEFINED, false, null));74assertEvalUnresolvedException("string();", "string", 0, 1);75assertActiveKeys();76}7778public void testForwardImportMethodOnDemandToMethod() {79DeclarationSnippet string = methodKey(assertEval("String string() { return format(\"string\"); }",80added(RECOVERABLE_DEFINED)));81assertUnresolvedDependencies1(string, RECOVERABLE_DEFINED, "method format(java.lang.String)");82assertEvalUnresolvedException("string();", "string", 1, 0);83assertEval("import static java.lang.String.*;",84added(VALID),85ste(string, RECOVERABLE_DEFINED, VALID, false, null));86assertEval("string();", "\"string\"");8788assertEval("double format(String s) { return 0; }",89DiagCheck.DIAG_OK,90DiagCheck.DIAG_ERROR,91added(VALID),92ste(string, VALID, RECOVERABLE_DEFINED, false, null));93assertEvalUnresolvedException("string();", "string", 0, 1);94assertActiveKeys();95}9697public void testForwardSingleImportFieldToMethod() {98DeclarationSnippet pi = methodKey(assertEval("double pi() { return PI; }",99added(RECOVERABLE_DEFINED)));100assertUnresolvedDependencies1(pi, RECOVERABLE_DEFINED, "variable PI");101assertEvalUnresolvedException("pi();", "pi", 1, 0);102assertEval("import static java.lang.Math.PI;",103added(VALID),104ste(pi, RECOVERABLE_DEFINED, VALID, false, null));105assertEval("Math.abs(pi() - 3.1415) < 0.001;", "true");106107assertEval("String PI;",108DiagCheck.DIAG_OK,109DiagCheck.DIAG_ERROR,110added(VALID),111ste(pi, VALID, RECOVERABLE_DEFINED, false, null));112assertEvalUnresolvedException("pi();", "pi", 0, 1);113assertActiveKeys();114}115116public void testForwardImportFieldOnDemandToMethod() {117DeclarationSnippet pi = methodKey(assertEval("double pi() { return PI; }",118added(RECOVERABLE_DEFINED)));119assertUnresolvedDependencies1(pi, RECOVERABLE_DEFINED, "variable PI");120assertEvalUnresolvedException("pi();", "pi", 1, 0);121assertEval("import static java.lang.Math.*;",122added(VALID),123ste(pi, RECOVERABLE_DEFINED, VALID, false, MAIN_SNIPPET));124assertEval("Math.abs(pi() - 3.1415) < 0.001;", "true");125126assertEval("String PI;",127DiagCheck.DIAG_OK,128DiagCheck.DIAG_ERROR,129added(VALID),130ste(pi, VALID, RECOVERABLE_DEFINED, false, MAIN_SNIPPET));131assertEvalUnresolvedException("pi();", "pi", 0, 1);132assertActiveKeys();133}134135public void testForwardSingleImportMethodToClass1() {136Snippet a = classKey(assertEval("class A { String s = format(\"%d\", 10); }",137added(RECOVERABLE_DEFINED)));138assertEvalUnresolvedException("new A();", "A", 1, 0);139assertEval("import static java.lang.String.format;",140added(VALID),141ste(a, RECOVERABLE_DEFINED, VALID, false, null));142assertEval("new A().s;", "\"10\"");143Snippet format = methodKey(assertEval("void format(String s, int d) { }",144DiagCheck.DIAG_OK,145DiagCheck.DIAG_ERROR,146added(VALID),147ste(a, VALID, RECOVERABLE_DEFINED, false, MAIN_SNIPPET)));148assertEvalUnresolvedException("new A();", "A", 0, 1);149assertActiveKeys();150assertDrop(format,151ste(format, VALID, DROPPED, true, null),152ste(a, RECOVERABLE_DEFINED, VALID, false, format));153}154155public void testForwardSingleImportMethodToClass2() {156Snippet a = classKey(assertEval("class A { String s() { return format(\"%d\", 10); } }",157added(RECOVERABLE_DEFINED)));158assertEvalUnresolvedException("new A();", "A", 1, 0);159assertEval("import static java.lang.String.format;",160added(VALID),161ste(a, RECOVERABLE_DEFINED, VALID, false, null));162assertEval("new A().s();", "\"10\"");163Snippet format = methodKey(assertEval("void format(String s, int d) { }",164DiagCheck.DIAG_OK,165DiagCheck.DIAG_ERROR,166added(VALID),167ste(a, VALID, RECOVERABLE_DEFINED, false, null)));168assertEvalUnresolvedException("new A();", "A", 0, 1);169assertActiveKeys();170assertDrop(format,171ste(format, VALID, DROPPED, true, null),172ste(a, RECOVERABLE_DEFINED, VALID, false, format));173}174175public void testForwardSingleImportClassToClass1() {176Snippet a = classKey(assertEval("class A { static List<Integer> list; }",177added(RECOVERABLE_NOT_DEFINED)));178assertDeclareFail("new A();", "compiler.err.cant.resolve.location");179assertEval("import java.util.List;",180added(VALID),181ste(a, RECOVERABLE_NOT_DEFINED, VALID, true, null));182assertEval("import java.util.Arrays;", added(VALID));183assertEval("A.list = Arrays.asList(1, 2, 3);", "[1, 2, 3]");184185Snippet list = classKey(assertEval("class List {}",186DiagCheck.DIAG_OK,187DiagCheck.DIAG_ERROR,188added(VALID),189ste(a, VALID, RECOVERABLE_NOT_DEFINED, true, null)));190assertDeclareFail("A.list = Arrays.asList(1, 2, 3);", "compiler.err.already.defined.single.import");191assertActiveKeys();192assertDrop(list,193ste(list, VALID, DROPPED, true, null),194ste(a, RECOVERABLE_NOT_DEFINED, VALID, true, list));195}196197public void testForwardSingleImportClassToClass2() {198Snippet clsA = classKey(assertEval("class A extends ArrayList<Integer> { }",199added(RECOVERABLE_NOT_DEFINED)));200assertDeclareFail("new A();", "compiler.err.cant.resolve.location");201assertEval("import java.util.ArrayList;",202added(VALID),203ste(clsA, RECOVERABLE_NOT_DEFINED, VALID, true, MAIN_SNIPPET));204Snippet vara = varKey(assertEval("A a = new A();", "[]"));205206Snippet arraylist = classKey(assertEval("class ArrayList {}",207DiagCheck.DIAG_OK,208DiagCheck.DIAG_ERROR,209added(VALID),210ste(clsA, VALID, RECOVERABLE_NOT_DEFINED, true, MAIN_SNIPPET),211ste(vara, VALID, RECOVERABLE_NOT_DEFINED, true, clsA)));212assertDeclareFail("A a = new A();", "compiler.err.cant.resolve.location",213ste(MAIN_SNIPPET, RECOVERABLE_NOT_DEFINED, REJECTED, false, null),214ste(vara, RECOVERABLE_NOT_DEFINED, OVERWRITTEN, false, MAIN_SNIPPET));215assertActiveKeys();216assertDrop(arraylist,217ste(arraylist, VALID, DROPPED, true, null),218ste(clsA, RECOVERABLE_NOT_DEFINED, VALID, true, arraylist));219}220221public void testForwardImportOnDemandMethodToClass1() {222Snippet a = classKey(assertEval("class A { String s = format(\"%d\", 10); }",223added(RECOVERABLE_DEFINED)));224assertEvalUnresolvedException("new A();", "A", 1, 0);225assertEval("import static java.lang.String.*;",226added(VALID),227ste(a, RECOVERABLE_DEFINED, VALID, false, null));228assertEval("A x = new A();");229assertEval("x.s;", "\"10\"");230Snippet format = methodKey(assertEval("void format(String s, int d) { }",231DiagCheck.DIAG_OK,232DiagCheck.DIAG_ERROR,233added(VALID),234ste(a, VALID, RECOVERABLE_DEFINED, false, null)));235assertEvalUnresolvedException("new A();", "A", 0, 1);236assertActiveKeys();237assertDrop(format,238ste(format, VALID, DROPPED, true, null),239ste(a, RECOVERABLE_DEFINED, VALID, false, format));240assertEval("x.s;", "\"10\"");241}242243public void testForwardImportOnDemandMethodToClass2() {244Snippet a = classKey(assertEval("class A { String s() { return format(\"%d\", 10); } }",245added(RECOVERABLE_DEFINED)));246assertEvalUnresolvedException("new A();", "A", 1, 0);247assertEval("import static java.lang.String.*;",248added(VALID),249ste(a, RECOVERABLE_DEFINED, VALID, false, null));250assertEval("new A().s();", "\"10\"");251Snippet format = methodKey(assertEval("void format(String s, int d) { }",252DiagCheck.DIAG_OK,253DiagCheck.DIAG_ERROR,254added(VALID),255ste(a, VALID, RECOVERABLE_DEFINED, false, null)));256assertEvalUnresolvedException("new A();", "A", 0, 1);257assertActiveKeys();258assertDrop(format,259ste(format, VALID, DROPPED, true, null),260ste(a, RECOVERABLE_DEFINED, VALID, false, format));261}262263public void testForwardImportOnDemandClassToClass1() {264Snippet a = classKey(assertEval("class A { static List<Integer> list; }",265added(RECOVERABLE_NOT_DEFINED)));266assertDeclareFail("new A();", "compiler.err.cant.resolve.location");267assertEval("import java.util.*;",268added(VALID),269ste(a, RECOVERABLE_NOT_DEFINED, VALID, true, null));270assertEval("A.list = Arrays.asList(1, 2, 3);", "[1, 2, 3]");271272Snippet list = classKey(assertEval("class List {}",273DiagCheck.DIAG_OK,274DiagCheck.DIAG_ERROR,275added(VALID),276ste(a, VALID, RECOVERABLE_NOT_DEFINED, true, null)));277assertDeclareFail("A.list = Arrays.asList(1, 2, 3);", "compiler.err.cant.resolve.location");278assertActiveKeys();279assertDrop(list,280ste(list, VALID, DROPPED, true, null),281ste(a, RECOVERABLE_NOT_DEFINED, VALID, true, list));282}283284public void testForwardImportOnDemandClassToClass2() {285Snippet clsA = classKey(assertEval("class A extends ArrayList<Integer> { }",286added(RECOVERABLE_NOT_DEFINED)));287assertDeclareFail("new A();", "compiler.err.cant.resolve.location");288assertEval("import java.util.*;",289added(VALID),290ste(clsA, RECOVERABLE_NOT_DEFINED, VALID, true, MAIN_SNIPPET));291Snippet vara = varKey(assertEval("A a = new A();", "[]"));292293Snippet arraylist = classKey(assertEval("class ArrayList {}",294DiagCheck.DIAG_OK,295DiagCheck.DIAG_ERROR,296added(VALID),297ste(clsA, VALID, RECOVERABLE_NOT_DEFINED, true, MAIN_SNIPPET),298ste(vara, VALID, RECOVERABLE_NOT_DEFINED, true, clsA)));299assertDeclareFail("new A();", "compiler.err.cant.resolve.location");300assertActiveKeys();301assertDrop(arraylist,302ste(arraylist, VALID, DROPPED, true, null),303ste(clsA, RECOVERABLE_NOT_DEFINED, VALID, true, arraylist),304ste(vara, RECOVERABLE_NOT_DEFINED, VALID, true, clsA));305}306307public void testForwardSingleImportFieldToClass1() {308Snippet a = classKey(assertEval("class A { static double pi() { return PI; } }",309added(RECOVERABLE_DEFINED)));310assertEvalUnresolvedException("new A();", "A", 1, 0);311assertEval("import static java.lang.Math.PI;",312added(VALID),313ste(a, RECOVERABLE_DEFINED, VALID, false, null));314assertEval("Math.abs(A.pi() - 3.1415) < 0.001;", "true");315316Snippet list = varKey(assertEval("String PI;",317DiagCheck.DIAG_OK,318DiagCheck.DIAG_ERROR,319added(VALID),320ste(a, VALID, RECOVERABLE_DEFINED, false, null)));321assertEvalUnresolvedException("new A();", "A", 0, 1);322assertActiveKeys();323assertDrop(list,324ste(list, VALID, DROPPED, true, null),325ste(a, RECOVERABLE_DEFINED, VALID, false, list));326}327328public void testForwardSingleImportFieldToClass2() {329Snippet a = classKey(assertEval("class A { static double pi = PI; }",330added(RECOVERABLE_DEFINED)));331assertEvalUnresolvedException("new A();", "A", 1, 0);332assertEval("import static java.lang.Math.PI;",333added(VALID),334ste(a, RECOVERABLE_DEFINED, VALID, true, null));335assertEval("Math.abs(A.pi - 3.1415) < 0.001;", "true");336337Snippet list = varKey(assertEval("String PI;",338DiagCheck.DIAG_OK,339DiagCheck.DIAG_ERROR,340added(VALID),341ste(a, VALID, RECOVERABLE_DEFINED, true, null)));342assertEvalUnresolvedException("new A();", "A", 0, 1);343assertActiveKeys();344assertDrop(list,345ste(list, VALID, DROPPED, true, null),346ste(a, RECOVERABLE_DEFINED, VALID, true, list));347}348349public void testForwardImportOnDemandFieldToClass1() {350Snippet a = classKey(assertEval("class A { static double pi() { return PI; } }",351added(RECOVERABLE_DEFINED)));352assertEvalUnresolvedException("new A();", "A", 1, 0);353assertEval("import static java.lang.Math.*;",354added(VALID),355ste(a, RECOVERABLE_DEFINED, VALID, false, null));356assertEval("Math.abs(A.pi() - 3.1415) < 0.001;", "true");357358Snippet list = varKey(assertEval("String PI;",359DiagCheck.DIAG_OK,360DiagCheck.DIAG_ERROR,361added(VALID),362ste(a, VALID, RECOVERABLE_DEFINED, false, null)));363assertEvalUnresolvedException("new A();", "A", 0, 1);364assertActiveKeys();365assertDrop(list,366ste(list, VALID, DROPPED, true, null),367ste(a, RECOVERABLE_DEFINED, VALID, false, list));368}369370public void testForwardImportOnDemandFieldToClass2() {371Snippet a = classKey(assertEval("class A { static double pi = PI; }",372added(RECOVERABLE_DEFINED)));373assertEvalUnresolvedException("new A();", "A", 1, 0);374assertEval("import static java.lang.Math.*;",375added(VALID),376ste(a, RECOVERABLE_DEFINED, VALID, true, null));377assertEval("Math.abs(A.pi - 3.1415) < 0.001;", "true");378379Snippet list = varKey(assertEval("String PI;",380DiagCheck.DIAG_OK,381DiagCheck.DIAG_ERROR,382added(VALID),383ste(a, VALID, RECOVERABLE_DEFINED, true, null)));384assertEvalUnresolvedException("new A();", "A", 0, 1);385assertActiveKeys();386assertDrop(list,387ste(list, VALID, DROPPED, true, null),388ste(a, RECOVERABLE_DEFINED, VALID, true, list));389assertEval("Math.abs(A.pi - 3.1415) < 0.001;", "true");390}391}392393394