DropTest.java revision 3062:15bdc18525ff
1279377Simp/*
2279377Simp * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
3279377Simp * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4279377Simp *
5279377Simp * This code is free software; you can redistribute it and/or modify it
6279377Simp * under the terms of the GNU General Public License version 2 only, as
7279377Simp * published by the Free Software Foundation.
8279377Simp *
9279377Simp * This code is distributed in the hope that it will be useful, but WITHOUT
10279377Simp * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11279377Simp * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12279377Simp * version 2 for more details (a copy is included in the LICENSE file that
13279377Simp * accompanied this code).
14279377Simp *
15279377Simp * You should have received a copy of the GNU General Public License version
16279377Simp * 2 along with this work; if not, write to the Free Software Foundation,
17279377Simp * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18279377Simp *
19279377Simp * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20279377Simp * or visit www.oracle.com if you need additional information or have any
21279377Simp * questions.
22279377Simp */
23279377Simp
24279377Simp/*
25279377Simp * @test
26279377Simp * @summary Test of JShell#drop().
27279377Simp * @build KullaTesting TestingInputStream
28279377Simp * @run testng DropTest
29279377Simp */
30279377Simp
31279377Simpimport jdk.jshell.DeclarationSnippet;
32279377Simpimport jdk.jshell.PersistentSnippet;
33279377Simpimport org.testng.annotations.Test;
34279377Simp
35279377Simpimport static jdk.jshell.Snippet.Status.*;
36279377Simp
37279377Simp@Test
38279377Simppublic class DropTest extends KullaTesting {
39279377Simp
40279377Simp    public void testDrop() {
41279377Simp        PersistentSnippet var = varKey(assertEval("int x;"));
42279377Simp        PersistentSnippet method = methodKey(assertEval("int mu() { return x * 4; }"));
43279377Simp        PersistentSnippet clazz = classKey(assertEval("class C { String v() { return \"#\" + mu(); } }"));
44279377Simp        assertDrop(var,
45279377Simp                ste(var, VALID, DROPPED, true, null),
46279377Simp                ste(method, VALID, RECOVERABLE_DEFINED, false, var));
47279377Simp        //assertDrop(method,
48279377Simp        //        ste(method, RECOVERABLE_DEFINED, DROPPED, false, null),
49279377Simp        //        ste(clazz, RECOVERABLE_NOT_DEFINED, RECOVERABLE_NOT_DEFINED, false, method));
50279377Simp        //assertDeclareFail("new C();", "compiler.err.cant.resolve.location");
51279377Simp        assertVariables();
52279377Simp        assertMethods();
53279377Simp        assertClasses();
54279377Simp        assertActiveKeys();
55279377Simp
56279377Simp        assertEval("int x = 10;", "10",
57279377Simp                ste(var, DROPPED, VALID, true, null),
58279377Simp                ste(method, RECOVERABLE_DEFINED, VALID, false, MAIN_SNIPPET));
59279377Simp        PersistentSnippet c0 = varKey(assertEval("C c0 = new C();"));
60279377Simp        assertEval("c0.v();", "\"#40\"");
61279377Simp        assertEval("C c = new C();");
62279377Simp        assertEval("c.v();", "\"#40\"");
63279377Simp        assertEval("int mu() { return x * 3; }",
64279377Simp                ste(MAIN_SNIPPET, VALID, VALID, false, null),
65279377Simp                ste(method, VALID, OVERWRITTEN, false, MAIN_SNIPPET));
66279377Simp        assertEval("c.v();", "\"#30\"");
67279377Simp        assertEval("class C { String v() { return \"@\" + mu(); } }",
68279377Simp                ste(MAIN_SNIPPET, VALID, VALID, false, null),
69279377Simp                ste(clazz, VALID, OVERWRITTEN, false, MAIN_SNIPPET));
70279377Simp        assertEval("c0.v();", "\"@30\"");
71279377Simp        assertDrop(c0,
72279377Simp                ste(c0, VALID, DROPPED, true, null));
73279377Simp        assertEval("c = new C();");
74279377Simp        assertEval("c.v();", "\"@30\"");
75279377Simp
76279377Simp        assertVariables();
77279377Simp        assertMethods();
78279377Simp        assertClasses();
79279377Simp        assertActiveKeys();
80279377Simp    }
81279377Simp
82279377Simp    @Test(enabled = false) // TODO 8081431
83279377Simp    public void testDropImport() {
84279377Simp        PersistentSnippet imp = importKey(assertEval("import java.util.*;"));
85279377Simp        PersistentSnippet decl = varKey(
86279377Simp                assertEval("List<Integer> list = Arrays.asList(1, 2, 3);", "[1, 2, 3]"));
87279377Simp        assertEval("list;", "[1, 2, 3]");
88279377Simp        assertDrop(imp,
89279377Simp                DiagCheck.DIAG_OK,
90279377Simp                DiagCheck.DIAG_ERROR,
91279377Simp                ste(imp, VALID, DROPPED, true, null),
92279377Simp                ste(decl, VALID, RECOVERABLE_NOT_DEFINED, true, imp));
93279377Simp        assertDeclareFail("list;", "compiler.err.cant.resolve.location");
94279377Simp    }
95279377Simp
96279377Simp    public void testDropVarToMethod() {
97279377Simp        PersistentSnippet x = varKey(assertEval("int x;"));
98279377Simp        DeclarationSnippet method = methodKey(assertEval("double mu() { return x * 4; }"));
99279377Simp        assertEval("x == 0;", "true");
100279377Simp        assertEval("mu() == 0.0;", "true");
101279377Simp
102279377Simp        assertDrop(x,
103                ste(x, VALID, DROPPED, true, null),
104                ste(method, VALID, RECOVERABLE_DEFINED, false, x));
105        assertUnresolvedDependencies1(method, RECOVERABLE_DEFINED, "variable x");
106        assertEvalUnresolvedException("mu();", "mu", 1, 0);
107
108        assertVariables();
109        assertMethods();
110        assertActiveKeys();
111    }
112
113    public void testDropMethodToMethod() {
114        PersistentSnippet a = methodKey(assertEval("double a() { return 2; }"));
115        DeclarationSnippet b = methodKey(assertEval("double b() { return a() * 10; }"));
116        assertEval("double c() { return b() * 3; }");
117        DeclarationSnippet d = methodKey(assertEval("double d() { return c() + 1000; }"));
118        assertEval("d();", "1060.0");
119        assertDrop(a,
120                ste(a, VALID, DROPPED, true, null),
121                ste(b, VALID, RECOVERABLE_DEFINED, false, a));
122        assertUnresolvedDependencies1(b, RECOVERABLE_DEFINED, "method a()");
123        assertUnresolvedDependencies(d, 0);
124        assertEvalUnresolvedException("d();", "b", 1, 0);
125        assertMethods();
126        assertActiveKeys();
127    }
128
129    public void testDropClassToMethod() {
130        PersistentSnippet c = classKey(assertEval("class C { int f() { return 7; } }"));
131        DeclarationSnippet m = methodKey(assertEval("int m() { return new C().f(); }"));
132        assertDrop(c,
133                ste(c, VALID, DROPPED, true, null),
134                ste(m, VALID, RECOVERABLE_DEFINED, false, c));
135        assertUnresolvedDependencies1(m, RECOVERABLE_DEFINED, "class C");
136        assertEvalUnresolvedException("m();", "m", 1, 0);
137        assertActiveKeys();
138    }
139
140    public void testDropVarToClass() {
141        PersistentSnippet x = varKey(assertEval("int x;"));
142        DeclarationSnippet a = classKey(assertEval("class A { double a = 4 * x; }"));
143        assertDrop(x,
144                DiagCheck.DIAG_OK,
145                DiagCheck.DIAG_ERROR,
146                ste(x, VALID, DROPPED, true, null),
147                ste(a, VALID, RECOVERABLE_NOT_DEFINED, true, x));
148        assertUnresolvedDependencies1(a, RECOVERABLE_NOT_DEFINED, "variable x");
149        assertDeclareFail("new A().a;", "compiler.err.cant.resolve.location");
150        assertVariables();
151        assertActiveKeys();
152    }
153
154    public void testDropMethodToClass() {
155        PersistentSnippet x = methodKey(assertEval("int x() { return 0; }"));
156        DeclarationSnippet a = classKey(assertEval("class A { double a = 4 * x(); }"));
157        assertDrop(x,
158                DiagCheck.DIAG_OK,
159                DiagCheck.DIAG_ERROR,
160                ste(x, VALID, DROPPED, true, null),
161                ste(a, VALID, RECOVERABLE_NOT_DEFINED, true, x));
162        assertUnresolvedDependencies1(a, RECOVERABLE_NOT_DEFINED, "method x()");
163        assertDeclareFail("new A().a;", "compiler.err.cant.resolve.location");
164        assertMethods();
165        assertActiveKeys();
166    }
167
168    public void testDropClassToClass() {
169        PersistentSnippet a = classKey(assertEval("class A {}"));
170        PersistentSnippet b = classKey(assertEval("class B extends A {}"));
171        PersistentSnippet c = classKey(assertEval("class C extends B {}"));
172        PersistentSnippet d = classKey(assertEval("class D extends C {}"));
173        assertDrop(a,
174                DiagCheck.DIAG_OK,
175                DiagCheck.DIAG_ERROR,
176                ste(a, VALID, DROPPED, true, null),
177                ste(b, VALID, RECOVERABLE_NOT_DEFINED, true, a),
178                ste(c, VALID, RECOVERABLE_NOT_DEFINED, true, b),
179                ste(d, VALID, RECOVERABLE_NOT_DEFINED, true, c));
180        assertUnresolvedDependencies1((DeclarationSnippet) b, RECOVERABLE_NOT_DEFINED, "class A");
181        assertDrop(c,
182                DiagCheck.DIAG_OK,
183                DiagCheck.DIAG_ERROR,
184                ste(c, RECOVERABLE_NOT_DEFINED, DROPPED, false, null),
185                ste(d, RECOVERABLE_NOT_DEFINED, RECOVERABLE_NOT_DEFINED, false, c));
186        assertEval("interface A {}", null, null,
187                DiagCheck.DIAG_OK, DiagCheck.DIAG_ERROR,
188                ste(a, DROPPED, VALID, true, null),
189                ste(b, RECOVERABLE_NOT_DEFINED, RECOVERABLE_NOT_DEFINED, false, MAIN_SNIPPET));
190        assertClasses();
191        assertActiveKeys();
192    }
193
194    public void testDropNoUpdate() {
195        String as1 = "class A {}";
196        String as2 = "class A extends java.util.ArrayList<Boolean> {}";
197        PersistentSnippet a = classKey(assertEval(as1, added(VALID)));
198        PersistentSnippet b = classKey(assertEval("class B extends A {}", added(VALID)));
199        PersistentSnippet ax = classKey(assertEval(as2,
200                ste(MAIN_SNIPPET, VALID, VALID, true, null),
201                ste(a, VALID, OVERWRITTEN, false, MAIN_SNIPPET),
202                ste(b, VALID, VALID, true, MAIN_SNIPPET)));
203        ax = classKey(assertEval(as1,
204                ste(MAIN_SNIPPET, VALID, VALID, true, null),
205                ste(ax, VALID, OVERWRITTEN, false, MAIN_SNIPPET),
206                ste(b, VALID, VALID, true, MAIN_SNIPPET)));
207        assertDrop(b,
208                ste(b, VALID, DROPPED, true, null));
209        ax = classKey(assertEval(as2,
210                ste(MAIN_SNIPPET, VALID, VALID, true, null),
211                ste(ax, VALID, OVERWRITTEN, false, MAIN_SNIPPET)));
212        assertEval(as1,
213                ste(MAIN_SNIPPET, VALID, VALID, true, null),
214                ste(ax, VALID, OVERWRITTEN, false, MAIN_SNIPPET));
215    }
216}
217