langtools/test/jdk/jshell/AnalyzeSnippetTest.java
changeset 46185 f4c981fc7818
equal deleted inserted replaced
46184:f1325703ea85 46185:f4c981fc7818
       
     1 /*
       
     2  * Copyright (c) 2017, 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 8182270
       
    27  * @summary test non-eval Snippet analysis
       
    28  * @build KullaTesting TestingInputStream
       
    29  * @run testng AnalyzeSnippetTest
       
    30  */
       
    31 
       
    32 import java.io.ByteArrayOutputStream;
       
    33 import java.io.PrintStream;
       
    34 import java.util.List;
       
    35 import jdk.jshell.Snippet;
       
    36 import jdk.jshell.DeclarationSnippet;
       
    37 import org.testng.annotations.Test;
       
    38 
       
    39 import jdk.jshell.JShell;
       
    40 import jdk.jshell.MethodSnippet;
       
    41 import static org.testng.Assert.assertFalse;
       
    42 import static org.testng.Assert.assertTrue;
       
    43 import static org.testng.Assert.assertEquals;
       
    44 import org.testng.annotations.AfterMethod;
       
    45 import org.testng.annotations.BeforeMethod;
       
    46 import jdk.jshell.ErroneousSnippet;
       
    47 import jdk.jshell.ExpressionSnippet;
       
    48 import jdk.jshell.ImportSnippet;
       
    49 import jdk.jshell.Snippet.SubKind;
       
    50 import jdk.jshell.SourceCodeAnalysis;
       
    51 import jdk.jshell.StatementSnippet;
       
    52 import jdk.jshell.TypeDeclSnippet;
       
    53 import jdk.jshell.VarSnippet;
       
    54 import static jdk.jshell.Snippet.SubKind.*;
       
    55 
       
    56 @Test
       
    57 public class AnalyzeSnippetTest {
       
    58 
       
    59     JShell state;
       
    60     SourceCodeAnalysis sca;
       
    61 
       
    62     @BeforeMethod
       
    63     public void setUp() {
       
    64         state = JShell.builder()
       
    65                 .out(new PrintStream(new ByteArrayOutputStream()))
       
    66                 .err(new PrintStream(new ByteArrayOutputStream()))
       
    67                 .build();
       
    68         sca = state.sourceCodeAnalysis();
       
    69     }
       
    70 
       
    71     @AfterMethod
       
    72     public void tearDown() {
       
    73         if (state != null) {
       
    74             state.close();
       
    75         }
       
    76         state = null;
       
    77         sca = null;
       
    78     }
       
    79 
       
    80     public void testImport() {
       
    81         ImportSnippet sn = (ImportSnippet) assertSnippet("import java.util.List;",
       
    82                 SubKind.SINGLE_TYPE_IMPORT_SUBKIND);
       
    83         assertEquals(sn.name(), "List");
       
    84         sn = (ImportSnippet) assertSnippet("import static java.nio.file.StandardOpenOption.CREATE;",
       
    85                 SubKind.SINGLE_STATIC_IMPORT_SUBKIND);
       
    86         assertTrue(sn.isStatic());
       
    87     }
       
    88 
       
    89     public void testClass() {
       
    90         TypeDeclSnippet sn = (TypeDeclSnippet) assertSnippet("class C {}",
       
    91                 SubKind.CLASS_SUBKIND);
       
    92         assertEquals(sn.name(), "C");
       
    93         sn = (TypeDeclSnippet) assertSnippet("enum EE {A, B , C}",
       
    94                 SubKind.ENUM_SUBKIND);
       
    95     }
       
    96 
       
    97     public void testMethod() {
       
    98         MethodSnippet sn = (MethodSnippet) assertSnippet("int m(int x) { return x + x; }",
       
    99                 SubKind.METHOD_SUBKIND);
       
   100         assertEquals(sn.name(), "m");
       
   101         assertEquals(sn.signature(), "(int)int");
       
   102     }
       
   103 
       
   104     public void testVar() {
       
   105         VarSnippet sn = (VarSnippet) assertSnippet("int i;",
       
   106                 SubKind.VAR_DECLARATION_SUBKIND);
       
   107         assertEquals(sn.name(), "i");
       
   108         assertEquals(sn.typeName(), "int");
       
   109         sn = (VarSnippet) assertSnippet("int jj = 6;",
       
   110                 SubKind.VAR_DECLARATION_WITH_INITIALIZER_SUBKIND);
       
   111         sn = (VarSnippet) assertSnippet("2 + 2",
       
   112                 SubKind.TEMP_VAR_EXPRESSION_SUBKIND);
       
   113     }
       
   114 
       
   115     public void testExpression() {
       
   116         state.eval("int aa = 10;");
       
   117         ExpressionSnippet sn = (ExpressionSnippet) assertSnippet("aa",
       
   118                 SubKind.VAR_VALUE_SUBKIND);
       
   119         assertEquals(sn.name(), "aa");
       
   120         assertEquals(sn.typeName(), "int");
       
   121         sn = (ExpressionSnippet) assertSnippet("aa;",
       
   122                 SubKind.VAR_VALUE_SUBKIND);
       
   123         assertEquals(sn.name(), "aa");
       
   124         assertEquals(sn.typeName(), "int");
       
   125         sn = (ExpressionSnippet) assertSnippet("aa = 99",
       
   126                 SubKind.ASSIGNMENT_SUBKIND);
       
   127     }
       
   128 
       
   129     public void testStatement() {
       
   130         StatementSnippet sn = (StatementSnippet) assertSnippet("System.out.println(33)",
       
   131                 SubKind.STATEMENT_SUBKIND);
       
   132         sn = (StatementSnippet) assertSnippet("if (true) System.out.println(33);",
       
   133                 SubKind.STATEMENT_SUBKIND);
       
   134     }
       
   135 
       
   136     public void testErroneous() {
       
   137         ErroneousSnippet sn = (ErroneousSnippet) assertSnippet("+++",
       
   138                 SubKind.UNKNOWN_SUBKIND);
       
   139         sn = (ErroneousSnippet) assertSnippet("abc",
       
   140                 SubKind.UNKNOWN_SUBKIND);
       
   141     }
       
   142 
       
   143     public void testNoStateChange() {
       
   144         assertSnippet("int a = 5;", SubKind.VAR_DECLARATION_WITH_INITIALIZER_SUBKIND);
       
   145         assertSnippet("a", SubKind.UNKNOWN_SUBKIND);
       
   146         VarSnippet vsn = (VarSnippet) state.eval("int aa = 10;").get(0).snippet();
       
   147         assertSnippet("++aa;", SubKind.TEMP_VAR_EXPRESSION_SUBKIND);
       
   148         assertEquals(state.varValue(vsn), "10");
       
   149         assertSnippet("class CC {}", SubKind.CLASS_SUBKIND);
       
   150         assertSnippet("new CC();", SubKind.UNKNOWN_SUBKIND);
       
   151     }
       
   152 
       
   153     private Snippet assertSnippet(String input, SubKind sk) {
       
   154         List<Snippet> sns = sca.sourceToSnippets(input);
       
   155         assertEquals(sns.size(), 1, "snippet count");
       
   156         Snippet sn = sns.get(0);
       
   157         assertEquals(sn.id(), "*UNASSOCIATED*");
       
   158         assertEquals(sn.subKind(), sk);
       
   159         return sn;
       
   160     }
       
   161 }