jdk/test/java/lang/reflect/PublicMethods/PublicMethodsTest.java
author plevart
Thu, 05 Jan 2017 08:51:03 +0100
changeset 42997 5f83f2054eca
parent 42947 2453d65278f3
child 43249 b017b10f62ab
permissions -rw-r--r--
8172190: Re-apply the fix for bugs 8062389, 8029459, 8061950 Summary: Final fix for 8062389: Class.getMethod() is inconsistent with Class.getMethods() results, 8029459: getMethods returns methods that are not members of the class, 8061950: Class.getMethods() exhibits quadratic time complexity Reviewed-by: alanb, mchung, psandoz, dfuchs, darcy, redestad
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42947
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
     1
/*
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
     2
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
     4
 *
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
     7
 * published by the Free Software Foundation.
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
     8
 *
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    13
 * accompanied this code).
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    14
 *
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    18
 *
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    21
 * questions.
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    22
 */
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    23
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    24
import javax.tools.Diagnostic;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    25
import javax.tools.DiagnosticListener;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    26
import javax.tools.FileObject;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    27
import javax.tools.ForwardingJavaFileManager;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    28
import javax.tools.JavaCompiler;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    29
import javax.tools.JavaFileObject;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    30
import javax.tools.SimpleJavaFileObject;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    31
import javax.tools.StandardJavaFileManager;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    32
import javax.tools.StandardLocation;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    33
import javax.tools.ToolProvider;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    34
import java.io.BufferedReader;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    35
import java.io.ByteArrayOutputStream;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    36
import java.io.IOException;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    37
import java.io.InputStreamReader;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    38
import java.io.OutputStream;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    39
import java.io.UncheckedIOException;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    40
import java.lang.reflect.Method;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    41
import java.net.URI;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    42
import java.nio.charset.Charset;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    43
import java.util.ArrayList;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    44
import java.util.HashMap;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    45
import java.util.List;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    46
import java.util.Locale;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    47
import java.util.Map;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    48
import java.util.regex.Pattern;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    49
import java.util.stream.Collectors;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    50
import java.util.stream.IntStream;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    51
import java.util.stream.Stream;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    52
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    53
import static java.util.stream.Collectors.joining;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    54
import static java.util.stream.Collectors.toMap;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    55
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    56
/*
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    57
 * @test
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    58
 * @bug 8062389
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    59
 * @summary Nearly exhaustive test of Class.getMethod() and Class.getMethods()
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    60
 * @run main PublicMethodsTest
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    61
 */
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    62
public class PublicMethodsTest {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    63
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    64
    public static void main(String[] args) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    65
        Case c = new Case1();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    66
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    67
        int[] diffs = new int[1];
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    68
        try (Stream<Map.Entry<int[], Map<String, String>>>
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    69
                 expected = expectedResults(c)) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    70
            diffResults(c, expected)
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    71
                .forEach(diff -> {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    72
                    System.out.println(diff);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    73
                    diffs[0]++;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    74
                });
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    75
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    76
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    77
        if (diffs[0] > 0) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    78
            throw new RuntimeException(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    79
                "There were " + diffs[0] + " differences.");
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    80
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    81
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    82
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    83
    // use this to generate .results file for particular case
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    84
    public static class Generate {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    85
        public static void main(String[] args) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    86
            Case c = new Case1();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    87
            dumpResults(generateResults(c))
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    88
                .forEach(System.out::println);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    89
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    90
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    91
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    92
    interface Case {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    93
        Pattern PLACEHOLDER_PATTERN = Pattern.compile("\\$\\{(.+?)}");
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    94
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    95
        // possible variants of interface method
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    96
        List<String> INTERFACE_METHODS = List.of(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    97
            "", "void m();", "default void m() {}", "static void m() {}"
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    98
        );
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
    99
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   100
        // possible variants of class method
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   101
        List<String> CLASS_METHODS = List.of(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   102
            "", "public abstract void m();",
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   103
            "public void m() {}", "public static void m() {}"
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   104
        );
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   105
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   106
        // template with placeholders parsed with PLACEHOLDER_PATTERN
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   107
        String template();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   108
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   109
        // map of replacementKey (== PLACEHOLDER_PATTERN captured group #1) ->
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   110
        // list of possible replacements
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   111
        Map<String, List<String>> replacements();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   112
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   113
        // ordered list of replacement keys
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   114
        List<String> replacementKeys();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   115
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   116
        // names of types occurring in the template
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   117
        List<String> classNames();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   118
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   119
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   120
    static class Case1 implements Case {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   121
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   122
        private static final String TEMPLATE = Stream.of(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   123
            "interface I { ${I} }",
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   124
            "interface J { ${J} }",
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   125
            "interface K extends I, J { ${K} }",
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   126
            "abstract class C { ${C} }",
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   127
            "abstract class D extends C implements I { ${D} }",
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   128
            "abstract class E extends D implements J, K { ${E} }"
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   129
        ).collect(joining("\n"));
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   130
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   131
        private static final Map<String, List<String>> REPLACEMENTS = Map.of(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   132
            "I", INTERFACE_METHODS,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   133
            "J", INTERFACE_METHODS,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   134
            "K", INTERFACE_METHODS,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   135
            "C", CLASS_METHODS,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   136
            "D", CLASS_METHODS,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   137
            "E", CLASS_METHODS
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   138
        );
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   139
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   140
        private static final List<String> REPLACEMENT_KEYS = REPLACEMENTS
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   141
            .keySet().stream().sorted().collect(Collectors.toList());
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   142
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   143
        @Override
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   144
        public String template() {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   145
            return TEMPLATE;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   146
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   147
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   148
        @Override
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   149
        public Map<String, List<String>> replacements() {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   150
            return REPLACEMENTS;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   151
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   152
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   153
        @Override
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   154
        public List<String> replacementKeys() {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   155
            return REPLACEMENT_KEYS;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   156
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   157
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   158
        @Override
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   159
        public List<String> classNames() {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   160
            // just by accident, names of classes are equal to replacement keys
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   161
            // (this need not be the case in general)
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   162
            return REPLACEMENT_KEYS;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   163
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   164
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   165
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   166
    // generate all combinations as a tuple of indexes into lists of
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   167
    // replacements. The index of the element in int[] tuple represents the index
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   168
    // of the key in replacementKeys() list. The value of the element in int[] tuple
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   169
    // represents the index of the replacement string in list of strings in the
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   170
    // value of the entry of replacements() map with the corresponding key.
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   171
    static Stream<int[]> combinations(Case c) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   172
        int[] sizes = c.replacementKeys().stream()
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   173
                       .mapToInt(key -> c.replacements().get(key).size())
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   174
                       .toArray();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   175
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   176
        return Stream.iterate(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   177
            new int[sizes.length],
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   178
            state -> state != null,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   179
            state -> {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   180
                int[] newState = state.clone();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   181
                for (int i = 0; i < state.length; i++) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   182
                    if (++newState[i] < sizes[i]) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   183
                        return newState;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   184
                    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   185
                    newState[i] = 0;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   186
                }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   187
                // wrapped-around
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   188
                return null;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   189
            }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   190
        );
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   191
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   192
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   193
    // given the combination of indexes, return the expanded template
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   194
    static String expandTemplate(Case c, int[] combination) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   195
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   196
        // 1st create a map: key -> replacement string
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   197
        Map<String, String> map = new HashMap<>(combination.length * 4 / 3 + 1);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   198
        for (int i = 0; i < combination.length; i++) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   199
            String key = c.replacementKeys().get(i);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   200
            String repl = c.replacements().get(key).get(combination[i]);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   201
            map.put(key, repl);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   202
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   203
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   204
        return Case.PLACEHOLDER_PATTERN
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   205
            .matcher(c.template())
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   206
            .replaceAll(match -> map.get(match.group(1)));
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   207
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   208
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   209
    /**
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   210
     * compile expanded template into a ClassLoader that sees compiled classes
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   211
     */
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   212
    static ClassLoader compile(String source) throws CompileException {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   213
        JavaCompiler javac = ToolProvider.getSystemJavaCompiler();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   214
        if (javac == null) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   215
            throw new AssertionError("No Java compiler tool found.");
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   216
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   217
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   218
        ErrorsCollector errorsCollector = new ErrorsCollector();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   219
        StandardJavaFileManager standardJavaFileManager =
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   220
            javac.getStandardFileManager(errorsCollector, Locale.ROOT,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   221
                                         Charset.forName("UTF-8"));
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   222
        TestFileManager testFileManager = new TestFileManager(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   223
            standardJavaFileManager, source);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   224
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   225
        JavaCompiler.CompilationTask javacTask;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   226
        try {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   227
            javacTask = javac.getTask(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   228
                null, // use System.err
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   229
                testFileManager,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   230
                errorsCollector,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   231
                null,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   232
                null,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   233
                List.of(testFileManager.getJavaFileForInput(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   234
                    StandardLocation.SOURCE_PATH,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   235
                    TestFileManager.TEST_CLASS_NAME,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   236
                    JavaFileObject.Kind.SOURCE))
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   237
            );
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   238
        } catch (IOException e) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   239
            throw new UncheckedIOException(e);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   240
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   241
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   242
        javacTask.call();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   243
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   244
        if (errorsCollector.hasError()) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   245
            throw new CompileException(errorsCollector.getErrors());
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   246
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   247
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   248
        return new TestClassLoader(ClassLoader.getSystemClassLoader(),
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   249
                                   testFileManager);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   250
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   251
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   252
    static class CompileException extends Exception {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   253
        CompileException(List<Diagnostic<?>> diagnostics) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   254
            super(diagnostics.stream()
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   255
                             .map(diag -> diag.toString())
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   256
                             .collect(Collectors.joining("\n")));
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   257
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   258
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   259
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   260
    static class TestFileManager
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   261
        extends ForwardingJavaFileManager<StandardJavaFileManager> {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   262
        static final String TEST_CLASS_NAME = "Test";
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   263
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   264
        private final String testSource;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   265
        private final Map<String, ClassFileObject> classes = new HashMap<>();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   266
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   267
        TestFileManager(StandardJavaFileManager fileManager, String source) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   268
            super(fileManager);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   269
            testSource = "public class " + TEST_CLASS_NAME + " {}\n" +
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   270
                         source; // the rest of classes are package-private
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   271
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   272
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   273
        @Override
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   274
        public JavaFileObject getJavaFileForInput(Location location,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   275
                                                  String className,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   276
                                                  JavaFileObject.Kind kind)
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   277
        throws IOException {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   278
            if (location == StandardLocation.SOURCE_PATH &&
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   279
                kind == JavaFileObject.Kind.SOURCE &&
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   280
                TEST_CLASS_NAME.equals(className)) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   281
                return new SourceFileObject(className, testSource);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   282
            }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   283
            return super.getJavaFileForInput(location, className, kind);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   284
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   285
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   286
        private static class SourceFileObject extends SimpleJavaFileObject {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   287
            private final String source;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   288
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   289
            SourceFileObject(String className, String source) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   290
                super(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   291
                    URI.create("memory:/src/" +
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   292
                               className.replace('.', '/') + ".java"),
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   293
                    Kind.SOURCE
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   294
                );
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   295
                this.source = source;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   296
            }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   297
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   298
            @Override
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   299
            public CharSequence getCharContent(boolean ignoreEncodingErrors) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   300
                return source;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   301
            }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   302
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   303
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   304
        @Override
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   305
        public JavaFileObject getJavaFileForOutput(Location location,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   306
                                                   String className,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   307
                                                   JavaFileObject.Kind kind,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   308
                                                   FileObject sibling)
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   309
        throws IOException {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   310
            if (kind == JavaFileObject.Kind.CLASS) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   311
                ClassFileObject cfo = new ClassFileObject(className);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   312
                classes.put(className, cfo);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   313
                return cfo;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   314
            }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   315
            return super.getJavaFileForOutput(location, className, kind, sibling);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   316
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   317
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   318
        private static class ClassFileObject extends SimpleJavaFileObject {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   319
            final String className;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   320
            ByteArrayOutputStream byteArrayOutputStream;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   321
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   322
            ClassFileObject(String className) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   323
                super(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   324
                    URI.create("memory:/out/" +
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   325
                               className.replace('.', '/') + ".class"),
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   326
                    Kind.CLASS
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   327
                );
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   328
                this.className = className;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   329
            }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   330
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   331
            @Override
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   332
            public OutputStream openOutputStream() throws IOException {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   333
                return byteArrayOutputStream = new ByteArrayOutputStream();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   334
            }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   335
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   336
            byte[] getBytes() {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   337
                if (byteArrayOutputStream == null) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   338
                    throw new IllegalStateException(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   339
                        "No class file written for class: " + className);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   340
                }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   341
                return byteArrayOutputStream.toByteArray();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   342
            }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   343
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   344
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   345
        byte[] getClassBytes(String className) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   346
            ClassFileObject cfo = classes.get(className);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   347
            return (cfo == null) ? null : cfo.getBytes();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   348
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   349
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   350
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   351
    static class ErrorsCollector implements DiagnosticListener<JavaFileObject> {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   352
        private final List<Diagnostic<?>> errors = new ArrayList<>();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   353
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   354
        @Override
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   355
        public void report(Diagnostic<? extends JavaFileObject> diagnostic) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   356
            if (diagnostic.getKind() == Diagnostic.Kind.ERROR) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   357
                errors.add(diagnostic);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   358
            }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   359
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   360
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   361
        boolean hasError() {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   362
            return !errors.isEmpty();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   363
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   364
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   365
        List<Diagnostic<?>> getErrors() {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   366
            return errors;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   367
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   368
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   369
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   370
    static class TestClassLoader extends ClassLoader {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   371
        private final TestFileManager fileManager;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   372
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   373
        public TestClassLoader(ClassLoader parent, TestFileManager fileManager) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   374
            super(parent);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   375
            this.fileManager = fileManager;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   376
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   377
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   378
        @Override
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   379
        protected Class<?> findClass(String name) throws ClassNotFoundException {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   380
            byte[] classBytes = fileManager.getClassBytes(name);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   381
            if (classBytes == null) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   382
                throw new ClassNotFoundException(name);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   383
            }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   384
            return defineClass(name, classBytes, 0, classBytes.length);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   385
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   386
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   387
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   388
    static Map<String, String> generateResult(Case c, ClassLoader cl) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   389
        return
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   390
            c.classNames()
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   391
             .stream()
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   392
             .map(cn -> {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   393
                 try {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   394
                     return Class.forName(cn, false, cl);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   395
                 } catch (ClassNotFoundException e) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   396
                     throw new RuntimeException("Class not found: " + cn, e);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   397
                 }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   398
             })
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   399
             .flatMap(clazz -> Stream.of(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   400
                 Map.entry(clazz.getName() + ".gM", generateGetMethodResult(clazz)),
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   401
                 Map.entry(clazz.getName() + ".gMs", generateGetMethodsResult(clazz))
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   402
             ))
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   403
             .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   404
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   405
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   406
    static String generateGetMethodResult(Class<?> clazz) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   407
        try {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   408
            Method m = clazz.getMethod("m");
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   409
            return m.getDeclaringClass().getName() + "." + m.getName();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   410
        } catch (NoSuchMethodException e) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   411
            return "-";
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   412
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   413
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   414
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   415
    static String generateGetMethodsResult(Class<?> clazz) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   416
        return Stream.of(clazz.getMethods())
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   417
                     .filter(m -> m.getDeclaringClass() != Object.class)
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   418
                     .map(m -> m.getDeclaringClass().getName()
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   419
                               + "." + m.getName())
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   420
                     .collect(Collectors.joining(", ", "[", "]"));
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   421
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   422
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   423
    static Stream<Map.Entry<int[], Map<String, String>>> generateResults(Case c) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   424
        return combinations(c)
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   425
            .flatMap(comb -> {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   426
                String src = expandTemplate(c, comb);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   427
                ClassLoader cl;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   428
                try {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   429
                    cl = compile(src);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   430
                } catch (CompileException e) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   431
                    // ignore uncompilable combinations
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   432
                    return Stream.empty();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   433
                }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   434
                // compilation was successful -> generate result
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   435
                return Stream.of(Map.entry(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   436
                    comb,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   437
                    generateResult(c, cl)
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   438
                ));
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   439
            });
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   440
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   441
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   442
    static Stream<Map.Entry<int[], Map<String, String>>> expectedResults(Case c) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   443
        try {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   444
            BufferedReader r = new BufferedReader(new InputStreamReader(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   445
                c.getClass().getResourceAsStream(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   446
                    c.getClass().getSimpleName() + ".results"),
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   447
                "UTF-8"
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   448
            ));
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   449
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   450
            return parseResults(r.lines())
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   451
                .onClose(() -> {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   452
                    try {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   453
                        r.close();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   454
                    } catch (IOException ioe) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   455
                        throw new UncheckedIOException(ioe);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   456
                    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   457
                });
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   458
        } catch (IOException e) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   459
            throw new UncheckedIOException(e);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   460
        }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   461
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   462
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   463
    static Stream<Map.Entry<int[], Map<String, String>>> parseResults(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   464
        Stream<String> lines
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   465
    ) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   466
        return lines
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   467
            .map(l -> l.split(Pattern.quote("#")))
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   468
            .map(lkv -> Map.entry(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   469
                Stream.of(lkv[0].split(Pattern.quote(",")))
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   470
                      .mapToInt(Integer::parseInt)
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   471
                      .toArray(),
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   472
                Stream.of(lkv[1].split(Pattern.quote("|")))
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   473
                      .map(e -> e.split(Pattern.quote("=")))
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   474
                      .collect(toMap(ekv -> ekv[0], ekv -> ekv[1]))
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   475
            ));
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   476
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   477
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   478
    static Stream<String> dumpResults(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   479
        Stream<Map.Entry<int[], Map<String, String>>> results
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   480
    ) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   481
        return results
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   482
            .map(le ->
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   483
                     IntStream.of(le.getKey())
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   484
                              .mapToObj(String::valueOf)
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   485
                              .collect(joining(","))
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   486
                     + "#" +
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   487
                     le.getValue().entrySet().stream()
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   488
                       .map(e -> e.getKey() + "=" + e.getValue())
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   489
                       .collect(joining("|"))
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   490
            );
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   491
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   492
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   493
    static Stream<String> diffResults(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   494
        Case c,
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   495
        Stream<Map.Entry<int[], Map<String, String>>> expectedResults
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   496
    ) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   497
        return expectedResults
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   498
            .flatMap(exp -> {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   499
                int[] comb = exp.getKey();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   500
                Map<String, String> expected = exp.getValue();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   501
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   502
                String src = expandTemplate(c, comb);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   503
                ClassLoader cl;
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   504
                try {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   505
                    cl = compile(src);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   506
                } catch (CompileException ce) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   507
                    return Stream.of(src + "\n" +
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   508
                                     "got compilation error: " + ce);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   509
                }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   510
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   511
                Map<String, String> actual = generateResult(c, cl);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   512
                if (actual.equals(expected)) {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   513
                    return Stream.empty();
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   514
                } else {
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   515
                    Map<String, String> diff = new HashMap<>(expected);
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   516
                    diff.entrySet().removeAll(actual.entrySet());
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   517
                    return Stream.of(
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   518
                        diff.entrySet()
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   519
                            .stream()
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   520
                            .map(e -> "expected: " + e.getKey() + ": " +
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   521
                                      e.getValue() + "\n" +
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   522
                                      "  actual: " + e.getKey() + ": " +
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   523
                                      actual.get(e.getKey()) + "\n")
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   524
                            .collect(joining("\n", src + "\n\n", "\n"))
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   525
                    );
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   526
                }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   527
            });
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   528
    }
2453d65278f3 8062389: Class.getMethod() is inconsistent with Class.getMethods() results
plevart
parents:
diff changeset
   529
}