test/tools/javac/lambda/typeInference/combo/TypeInferenceComboTest.java

changeset 1482
954541f13717
parent 1415
01c9d4161882
child 1520
5c956be64b9e
     1.1 --- a/test/tools/javac/lambda/typeInference/combo/TypeInferenceComboTest.java	Tue Jan 08 10:17:29 2013 +0100
     1.2 +++ b/test/tools/javac/lambda/typeInference/combo/TypeInferenceComboTest.java	Tue Jan 08 13:47:57 2013 +0000
     1.3 @@ -1,5 +1,5 @@
     1.4  /*
     1.5 - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
     1.6 + * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
     1.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     1.8   *
     1.9   * This code is free software; you can redistribute it and/or modify it
    1.10 @@ -25,22 +25,24 @@
    1.11   * @test
    1.12   * @bug 8003280
    1.13   * @summary Add lambda tests
    1.14 - *  perform automated checks in type inference in lambda expressions in different contexts
    1.15 + *  perform automated checks in type inference in lambda expressions
    1.16 + *  in different contexts
    1.17 + * @library ../../../lib
    1.18 + * @build JavacTestingAbstractThreadedTest
    1.19   * @compile  TypeInferenceComboTest.java
    1.20   * @run main/timeout=360 TypeInferenceComboTest
    1.21   */
    1.22  
    1.23 -import com.sun.source.util.JavacTask;
    1.24  import java.net.URI;
    1.25  import java.util.Arrays;
    1.26  import javax.tools.Diagnostic;
    1.27 -import javax.tools.JavaCompiler;
    1.28  import javax.tools.JavaFileObject;
    1.29  import javax.tools.SimpleJavaFileObject;
    1.30 -import javax.tools.ToolProvider;
    1.31 -import javax.tools.StandardJavaFileManager;
    1.32 +import com.sun.source.util.JavacTask;
    1.33  
    1.34 -public class TypeInferenceComboTest {
    1.35 +public class TypeInferenceComboTest
    1.36 +    extends JavacTestingAbstractThreadedTest
    1.37 +    implements Runnable {
    1.38      enum Context {
    1.39          ASSIGNMENT("SAM#Type s = #LBody;"),
    1.40          METHOD_CALL("#GenericDeclKind void method1(SAM#Type s) { }\n" +
    1.41 @@ -59,27 +61,35 @@
    1.42              this.context = context;
    1.43          }
    1.44  
    1.45 -        String getContext(SamKind sk, TypeKind samTargetT, Keyword kw, TypeKind parameterT, TypeKind returnT, LambdaKind lk, ParameterKind pk, GenericDeclKind gdk, LambdaBody lb) {
    1.46 +        String getContext(SamKind sk, TypeKind samTargetT, Keyword kw,
    1.47 +                TypeKind parameterT, TypeKind returnT, LambdaKind lk,
    1.48 +                ParameterKind pk, GenericDeclKind gdk, LambdaBody lb) {
    1.49              String result = context;
    1.50              if (sk == SamKind.GENERIC) {
    1.51                  if(this == Context.METHOD_CALL) {
    1.52 -                    result = result.replaceAll("#GenericDeclKind", gdk.getGenericDeclKind(samTargetT));
    1.53 +                    result = result.replaceAll("#GenericDeclKind",
    1.54 +                            gdk.getGenericDeclKind(samTargetT));
    1.55                      if(gdk == GenericDeclKind.NON_GENERIC)
    1.56 -                        result = result.replaceAll("#Type", "<" + samTargetT.typeStr + ">");
    1.57 +                        result = result.replaceAll("#Type", "<" +
    1.58 +                                samTargetT.typeStr + ">");
    1.59                      else //#GenericDeclKind is <T> or <T extends xxx>
    1.60                          result = result.replaceAll("#Type", "<T>");
    1.61                  }
    1.62                  else {
    1.63                      if(kw == Keyword.VOID)
    1.64 -                        result = result.replaceAll("#Type", "<" + samTargetT.typeStr + ">");
    1.65 +                        result = result.replaceAll("#Type", "<" +
    1.66 +                                samTargetT.typeStr + ">");
    1.67                      else
    1.68 -                        result = result.replaceAll("#Type", "<? " + kw.keyStr + " " + samTargetT.typeStr + ">");
    1.69 +                        result = result.replaceAll("#Type", "<? " + kw.keyStr +
    1.70 +                                " " + samTargetT.typeStr + ">");
    1.71                  }
    1.72              }
    1.73              else
    1.74 -                result = result.replaceAll("#Type", "").replaceAll("#GenericDeclKind", "");
    1.75 +                result = result.replaceAll("#Type", "").
    1.76 +                        replaceAll("#GenericDeclKind", "");
    1.77  
    1.78 -            return result.replaceAll("#LBody", lb.getLambdaBody(samTargetT, parameterT, returnT, lk, pk));
    1.79 +            return result.replaceAll("#LBody",
    1.80 +                    lb.getLambdaBody(samTargetT, parameterT, returnT, lk, pk));
    1.81          }
    1.82      }
    1.83  
    1.84 @@ -94,8 +104,10 @@
    1.85          }
    1.86  
    1.87          String getSam(TypeKind parameterT, TypeKind returnT) {
    1.88 -            return sam_str.replaceAll("#ARG", parameterT == TypeKind.VOID ? "" : parameterT.typeStr + " arg")
    1.89 -                          .replaceAll("#R", returnT.typeStr);
    1.90 +            return sam_str.replaceAll("#ARG",
    1.91 +                    parameterT == TypeKind.VOID ?
    1.92 +                        "" : parameterT.typeStr + " arg")
    1.93 +                    .replaceAll("#R", returnT.typeStr);
    1.94          }
    1.95      }
    1.96  
    1.97 @@ -104,7 +116,8 @@
    1.98          STRING("String", "\"hello\""),
    1.99          INTEGER("Integer", "1"),
   1.100          INT("int", "0"),
   1.101 -        COMPARATOR("java.util.Comparator<String>", "(java.util.Comparator<String>)(a, b) -> a.length()-b.length()"),
   1.102 +        COMPARATOR("java.util.Comparator<String>",
   1.103 +                "(java.util.Comparator<String>)(a, b) -> a.length()-b.length()"),
   1.104          SAM("SAM2", "null"),
   1.105          GENERIC("T", null);
   1.106  
   1.107 @@ -152,8 +165,10 @@
   1.108      }
   1.109  
   1.110      enum LambdaBody {
   1.111 -        RETURN_VOID("() -> #RET"),//no parameters, return type is one of the TypeKind
   1.112 -        RETURN_ARG("(#PK arg) -> #RET");//has parameters, return type is one of the TypeKind
   1.113 +        //no parameters, return type is one of the TypeKind
   1.114 +        RETURN_VOID("() -> #RET"),
   1.115 +        //has parameters, return type is one of the TypeKind
   1.116 +        RETURN_ARG("(#PK arg) -> #RET");
   1.117  
   1.118          String bodyStr;
   1.119  
   1.120 @@ -161,12 +176,14 @@
   1.121              this.bodyStr = bodyStr;
   1.122          }
   1.123  
   1.124 -        String getLambdaBody(TypeKind samTargetT, TypeKind parameterT, TypeKind returnT, LambdaKind lk, ParameterKind pk) {
   1.125 +        String getLambdaBody(TypeKind samTargetT, TypeKind parameterT,
   1.126 +                TypeKind returnT, LambdaKind lk, ParameterKind pk) {
   1.127              String result = bodyStr.replaceAll("#PK", pk.paramTemplate);
   1.128  
   1.129              if(result.contains("#TYPE")) {
   1.130                  if (parameterT == TypeKind.GENERIC && this != RETURN_VOID)
   1.131 -                    result = result.replaceAll("#TYPE", samTargetT == null? "": samTargetT.typeStr);
   1.132 +                    result = result.replaceAll("#TYPE",
   1.133 +                            samTargetT == null? "": samTargetT.typeStr);
   1.134                  else
   1.135                      result = result.replaceAll("#TYPE", parameterT.typeStr);
   1.136              }
   1.137 @@ -174,9 +191,12 @@
   1.138                  return result.replaceAll("#RET", lk.stmt.replaceAll("#VAL", "arg"));
   1.139              else {
   1.140                  if(returnT != TypeKind.GENERIC)
   1.141 -                    return result.replaceAll("#RET", lk.stmt.replaceAll("#VAL", (returnT==TypeKind.VOID && lk==LambdaKind.EXPRESSION)? "{}" : returnT.valStr));
   1.142 +                    return result.replaceAll("#RET", lk.stmt.replaceAll("#VAL",
   1.143 +                            (returnT==TypeKind.VOID &&
   1.144 +                            lk==LambdaKind.EXPRESSION) ? "{}" : returnT.valStr));
   1.145                  else
   1.146 -                    return result.replaceAll("#RET", lk.stmt.replaceAll("#VAL", samTargetT.valStr));
   1.147 +                    return result.replaceAll("#RET",
   1.148 +                            lk.stmt.replaceAll("#VAL", samTargetT.valStr));
   1.149              }
   1.150          }
   1.151      }
   1.152 @@ -203,8 +223,10 @@
   1.153          }
   1.154          else if (lambdaBodyType != LambdaBody.RETURN_ARG)
   1.155              return false;
   1.156 -        if (  genericDeclKind == GenericDeclKind.GENERIC_NOBOUND || genericDeclKind == GenericDeclKind.GENERIC_BOUND ) {
   1.157 -            if ( parameterType == TypeKind.GENERIC && parameterKind == ParameterKind.IMPLICIT) //cyclic inference
   1.158 +        if (  genericDeclKind == GenericDeclKind.GENERIC_NOBOUND ||
   1.159 +                genericDeclKind == GenericDeclKind.GENERIC_BOUND ) {
   1.160 +            if ( parameterType == TypeKind.GENERIC &&
   1.161 +                    parameterKind == ParameterKind.IMPLICIT) //cyclic inference
   1.162                  return false;
   1.163          }
   1.164          return true;
   1.165 @@ -216,7 +238,8 @@
   1.166                           "}\n";
   1.167      SourceFile samSourceFile = new SourceFile("Sam.java", templateStr) {
   1.168          public String toString() {
   1.169 -            return template.replaceAll("#C", samKind.getSam(parameterType, returnType));
   1.170 +            return template.replaceAll("#C",
   1.171 +                    samKind.getSam(parameterType, returnType));
   1.172          }
   1.173      };
   1.174  
   1.175 @@ -225,22 +248,35 @@
   1.176                                                   "    #Context\n" +
   1.177                                                   "}") {
   1.178          public String toString() {
   1.179 -            return template.replaceAll("#Context", context.getContext(samKind, samTargetType, keyword, parameterType, returnType, lambdaKind, parameterKind, genericDeclKind, lambdaBodyType));
   1.180 +            return template.replaceAll("#Context",
   1.181 +                    context.getContext(samKind, samTargetType, keyword,
   1.182 +                    parameterType, returnType, lambdaKind, parameterKind,
   1.183 +                    genericDeclKind, lambdaBodyType));
   1.184          }
   1.185      };
   1.186  
   1.187 -    void test() throws Exception {
   1.188 -        System.out.println("kk:");
   1.189 +    public void run() {
   1.190 +        outWriter.println("kk:");
   1.191          StringBuilder sb = new StringBuilder("SamKind:");
   1.192 -        sb.append(samKind).append(" SamTargetType:").append(samTargetType).append(" ParameterType:").append(parameterType)
   1.193 -            .append(" ReturnType:").append(returnType).append(" Context:").append(context).append(" LambdaKind:").append(lambdaKind)
   1.194 -            .append(" LambdaBodyType:").append(lambdaBodyType).append(" ParameterKind:").append(parameterKind).append(" Keyword:").append(keyword);
   1.195 -        System.out.println(sb);
   1.196 +        sb.append(samKind).append(" SamTargetType:")
   1.197 +            .append(samTargetType).append(" ParameterType:").append(parameterType)
   1.198 +            .append(" ReturnType:").append(returnType).append(" Context:")
   1.199 +            .append(context).append(" LambdaKind:").append(lambdaKind)
   1.200 +            .append(" LambdaBodyType:").append(lambdaBodyType)
   1.201 +            .append(" ParameterKind:").append(parameterKind).append(" Keyword:")
   1.202 +            .append(keyword);
   1.203 +        outWriter.println(sb);
   1.204          DiagnosticChecker dc = new DiagnosticChecker();
   1.205 -        JavacTask ct = (JavacTask)comp.getTask(null, fm, dc, null, null, Arrays.asList(samSourceFile, clientSourceFile));
   1.206 -        ct.analyze();
   1.207 +        JavacTask ct = (JavacTask)comp.getTask(null, fm.get(), dc,
   1.208 +                null, null, Arrays.asList(samSourceFile, clientSourceFile));
   1.209 +        try {
   1.210 +            ct.analyze();
   1.211 +        } catch (Throwable t) {
   1.212 +            processException(t);
   1.213 +        }
   1.214          if (dc.errorFound == checkTypeInference()) {
   1.215 -            throw new AssertionError(samSourceFile + "\n\n" + clientSourceFile + "\n" + parameterType + " " + returnType);
   1.216 +            throw new AssertionError(samSourceFile + "\n\n" +
   1.217 +                    clientSourceFile + "\n" + parameterType + " " + returnType);
   1.218          }
   1.219      }
   1.220  
   1.221 @@ -261,7 +297,8 @@
   1.222          public abstract String toString();
   1.223      }
   1.224  
   1.225 -    static class DiagnosticChecker implements javax.tools.DiagnosticListener<JavaFileObject> {
   1.226 +    static class DiagnosticChecker
   1.227 +        implements javax.tools.DiagnosticListener<JavaFileObject> {
   1.228  
   1.229          boolean errorFound = false;
   1.230  
   1.231 @@ -283,10 +320,9 @@
   1.232      Keyword keyword;
   1.233      GenericDeclKind genericDeclKind;
   1.234  
   1.235 -    static JavaCompiler comp = ToolProvider.getSystemJavaCompiler();
   1.236 -    static StandardJavaFileManager fm = comp.getStandardFileManager(null, null, null);
   1.237 -
   1.238 -    TypeInferenceComboTest(SamKind sk, TypeKind samTargetT, TypeKind parameterT, TypeKind returnT, LambdaBody lb, Context c, LambdaKind lk, ParameterKind pk, Keyword kw, GenericDeclKind gdk) {
   1.239 +    TypeInferenceComboTest(SamKind sk, TypeKind samTargetT, TypeKind parameterT,
   1.240 +            TypeKind returnT, LambdaBody lb, Context c, LambdaKind lk,
   1.241 +            ParameterKind pk, Keyword kw, GenericDeclKind gdk) {
   1.242          samKind = sk;
   1.243          samTargetType = samTargetT;
   1.244          parameterType = parameterT;
   1.245 @@ -308,24 +344,14 @@
   1.246                              for(LambdaKind lambdaK : LambdaKind.values()) {
   1.247                                  for (SamKind sk : SamKind.values()) {
   1.248                                      if (sk == SamKind.NON_GENERIC) {
   1.249 -                                        if(parameterT != TypeKind.GENERIC && returnT != TypeKind.GENERIC )
   1.250 -                                            new TypeInferenceComboTest(sk, null, parameterT, returnT, lb, ct, lambdaK, parameterK, null, null).test();
   1.251 +                                        generateNonGenericSAM(ct, returnT,
   1.252 +                                                parameterT, lb, parameterK,
   1.253 +                                                lambdaK, sk);
   1.254                                      }
   1.255                                      else if (sk == SamKind.GENERIC) {
   1.256 -                                        for (Keyword kw : Keyword.values()) {
   1.257 -                                            for (TypeKind samTargetT : TypeKind.values()) {
   1.258 -                                                if(samTargetT != TypeKind.VOID && samTargetT != TypeKind.INT && samTargetT != TypeKind.GENERIC
   1.259 -                                                   && (parameterT == TypeKind.GENERIC || returnT == TypeKind.GENERIC)) {
   1.260 -                                                    if(ct != Context.METHOD_CALL) {
   1.261 -                                                        new TypeInferenceComboTest(sk, samTargetT, parameterT, returnT, lb, ct, lambdaK, parameterK, kw, null).test();
   1.262 -                                                    }
   1.263 -                                                    else {//Context.METHOD_CALL
   1.264 -                                                        for (GenericDeclKind gdk : GenericDeclKind.values())
   1.265 -                                                            new TypeInferenceComboTest(sk, samTargetT, parameterT, returnT, lb, ct, lambdaK, parameterK, kw, gdk).test();
   1.266 -                                                    }
   1.267 -                                                }
   1.268 -                                            }
   1.269 -                                        }
   1.270 +                                        generateGenericSAM(ct, returnT,
   1.271 +                                                parameterT, lb, parameterK,
   1.272 +                                                lambdaK, sk);
   1.273                                      }
   1.274                                  }
   1.275                              }
   1.276 @@ -334,5 +360,44 @@
   1.277                  }
   1.278              }
   1.279          }
   1.280 +
   1.281 +        checkAfterExec(false);
   1.282      }
   1.283 +
   1.284 +    static void generateNonGenericSAM(Context ct, TypeKind returnT,
   1.285 +            TypeKind parameterT, LambdaBody lb, ParameterKind parameterK,
   1.286 +            LambdaKind lambdaK, SamKind sk) {
   1.287 +        if(parameterT != TypeKind.GENERIC && returnT != TypeKind.GENERIC ) {
   1.288 +            pool.execute(new TypeInferenceComboTest(sk, null, parameterT,
   1.289 +                    returnT, lb, ct, lambdaK, parameterK, null, null));
   1.290 +        }
   1.291 +    }
   1.292 +
   1.293 +    static void generateGenericSAM(Context ct, TypeKind returnT,
   1.294 +            TypeKind parameterT, LambdaBody lb, ParameterKind parameterK,
   1.295 +            LambdaKind lambdaK, SamKind sk) {
   1.296 +        for (Keyword kw : Keyword.values()) {
   1.297 +            for (TypeKind samTargetT : TypeKind.values()) {
   1.298 +                if(samTargetT != TypeKind.VOID &&
   1.299 +                   samTargetT != TypeKind.INT &&
   1.300 +                   samTargetT != TypeKind.GENERIC &&
   1.301 +                   (parameterT == TypeKind.GENERIC ||
   1.302 +                   returnT == TypeKind.GENERIC)) {
   1.303 +                    if(ct != Context.METHOD_CALL) {
   1.304 +                        pool.execute(
   1.305 +                            new TypeInferenceComboTest(sk, samTargetT, parameterT,
   1.306 +                                returnT, lb, ct, lambdaK, parameterK, kw, null));
   1.307 +                    } else {//Context.METHOD_CALL
   1.308 +                        for (GenericDeclKind gdk :
   1.309 +                                GenericDeclKind.values())
   1.310 +                            pool.execute(
   1.311 +                                    new TypeInferenceComboTest(sk, samTargetT,
   1.312 +                                    parameterT, returnT, lb, ct, lambdaK,
   1.313 +                                    parameterK, kw, gdk));
   1.314 +                    }
   1.315 +                }
   1.316 +            }
   1.317 +         }
   1.318 +    }
   1.319 +
   1.320  }

mercurial