1 /* 2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @bug 8081431 27 * @summary Test of JShell#drop(). 28 * @build KullaTesting TestingInputStream 29 * @run testng DropTest 30 */ 31 32 import jdk.jshell.DeclarationSnippet; 33 import jdk.jshell.PersistentSnippet; 34 import org.testng.annotations.Test; 35 36 import static jdk.jshell.Snippet.Status.*; 37 38 @Test 39 public class DropTest extends KullaTesting { 40 41 public void testDrop() { 42 PersistentSnippet var = varKey(assertEval("int x;")); 43 PersistentSnippet method = methodKey(assertEval("int mu() { return x * 4; }")); 44 PersistentSnippet clazz = classKey(assertEval("class C { String v() { return \"#\" + mu(); } }")); 45 assertDrop(var, 46 ste(var, VALID, DROPPED, true, null), 47 ste(method, VALID, RECOVERABLE_DEFINED, false, var)); 48 //assertDrop(method, 49 // ste(method, RECOVERABLE_DEFINED, DROPPED, false, null), 50 // ste(clazz, RECOVERABLE_NOT_DEFINED, RECOVERABLE_NOT_DEFINED, false, method)); 51 //assertDeclareFail("new C();", "compiler.err.cant.resolve.location"); 52 assertVariables(); 53 assertMethods(); 54 assertClasses(); 55 assertActiveKeys(); 56 57 assertEval("int x = 10;", "10", 58 ste(var, DROPPED, VALID, true, null), 59 ste(method, RECOVERABLE_DEFINED, VALID, false, MAIN_SNIPPET)); 60 PersistentSnippet c0 = varKey(assertEval("C c0 = new C();")); 61 assertEval("c0.v();", "\"#40\""); 62 assertEval("C c = new C();"); 63 assertEval("c.v();", "\"#40\""); 64 assertEval("int mu() { return x * 3; }", 65 ste(MAIN_SNIPPET, VALID, VALID, false, null), 66 ste(method, VALID, OVERWRITTEN, false, MAIN_SNIPPET)); 67 assertEval("c.v();", "\"#30\""); 68 assertEval("class C { String v() { return \"@\" + mu(); } }", 69 ste(MAIN_SNIPPET, VALID, VALID, false, null), 70 ste(clazz, VALID, OVERWRITTEN, false, MAIN_SNIPPET)); 71 assertEval("c0.v();", "\"@30\""); 72 assertDrop(c0, 73 ste(c0, VALID, DROPPED, true, null)); 74 assertEval("c = new C();"); 75 assertEval("c.v();", "\"@30\""); 76 77 assertVariables(); 78 assertMethods(); 79 assertClasses(); 80 assertActiveKeys(); 81 } 82 83 public void testDropImport() { 84 PersistentSnippet imp = importKey(assertEval("import java.util.*;")); 85 PersistentSnippet decl = varKey( 86 assertEval("List<Integer> list = Arrays.asList(1, 2, 3);", "[1, 2, 3]")); 87 assertEval("list;", "[1, 2, 3]"); 88 assertDrop(imp, 89 DiagCheck.DIAG_OK, 90 DiagCheck.DIAG_ERROR, 91 ste(imp, VALID, DROPPED, true, null), 92 ste(decl, VALID, RECOVERABLE_NOT_DEFINED, true, imp)); 93 assertDeclareFail("list;", "compiler.err.cant.resolve.location"); 94 } 95 96 public void testDropVarToMethod() { 97 PersistentSnippet x = varKey(assertEval("int x;")); 98 DeclarationSnippet method = methodKey(assertEval("double mu() { return x * 4; }")); 99 assertEval("x == 0;", "true"); 100 assertEval("mu() == 0.0;", "true"); 101 102 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 }