hotspot/test/compiler/compilercontrol/share/method/MethodGenerator.java
author ppunegov
Thu, 24 Sep 2015 20:13:04 +0300
changeset 33081 71794b149055
child 33452 04815c29859c
permissions -rw-r--r--
8066157: JEP-JDK-8046155: Test task: method matcher Summary: MethodMatcher test and framework Reviewed-by: iignatyev, neliasso
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
33081
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
     1
/*
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
     2
 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
     4
 *
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
     7
 * published by the Free Software Foundation.
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
     8
 *
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    13
 * accompanied this code).
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    14
 *
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    18
 *
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    21
 * questions.
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    22
 */
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    23
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    24
package compiler.compilercontrol.share.method;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    25
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    26
import compiler.compilercontrol.share.method.MethodDescriptor.PatternType;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    27
import compiler.compilercontrol.share.method.MethodDescriptor.Separator;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    28
import jdk.test.lib.Pair;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    29
import jdk.test.lib.Triple;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    30
import jdk.test.lib.Utils;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    31
import pool.PoolHelper;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    32
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    33
import java.lang.reflect.Executable;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    34
import java.util.ArrayList;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    35
import java.util.EnumSet;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    36
import java.util.List;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    37
import java.util.concurrent.Callable;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    38
import java.util.function.Function;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    39
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    40
/**
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    41
 * Generates combinations of method descriptors from the pool of methods
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    42
 */
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    43
public class MethodGenerator {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    44
    private static final List<Pair<Executable, Callable<?>>> METHODS =
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    45
            new PoolHelper().getAllMethods(PoolHelper.METHOD_FILTER);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    46
    // Different combinations of patterns
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    47
    private static final List<Combination<PatternType>> PATTERNS_LIST;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    48
    // Different combinations of separators
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    49
    private static final List<Combination<Separator>> SEPARATORS_LIST;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    50
    // List of functions that modify elements
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    51
    private static final List<Function<String, String>> ELEMENT_MUTATORS;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    52
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    53
    static {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    54
        PATTERNS_LIST =
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    55
                generate(EnumSet.allOf(PatternType.class),
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    56
                        EnumSet.allOf(PatternType.class),
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    57
                        EnumSet.of(PatternType.ANY, PatternType.EXACT));
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    58
        SEPARATORS_LIST =
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    59
                generate(EnumSet.of(Separator.SLASH, Separator.DOT),
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    60
                        EnumSet.complementOf(EnumSet.of(Separator.NONE)),
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    61
                        EnumSet.of(Separator.COMMA, Separator.SPACE,
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    62
                                Separator.NONE));
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    63
        ELEMENT_MUTATORS = generateMutators();
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    64
    }
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    65
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    66
    // Test method
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    67
    public static void main(String[] args) {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    68
        MethodGenerator methodGenerator = new MethodGenerator();
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    69
        List<MethodDescriptor> tests = methodGenerator.getTests();
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    70
        tests.forEach(System.out::println);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    71
    }
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    72
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    73
    /**
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    74
     * Generates random method descriptor
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    75
     *
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    76
     * @param executable executable used to generate descriptor
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    77
     * @return MethodDescriptor instance
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    78
     */
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    79
    public MethodDescriptor generateRandomDescriptor(Executable executable) {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    80
        Combination<PatternType> patterns =
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    81
                Utils.getRandomElement(PATTERNS_LIST);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    82
        Combination<Separator> separators =
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    83
                Utils.getRandomElement(SEPARATORS_LIST);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    84
        // Create simple mutators for signature generation
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    85
        List<Function<String, String>> signMutators = new ArrayList<>();
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    86
        signMutators.add(input -> input);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    87
        signMutators.add(input -> "");
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    88
        Combination<Function<String, String>> mutators = new Combination<>(
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    89
                Utils.getRandomElement(ELEMENT_MUTATORS),
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    90
                Utils.getRandomElement(ELEMENT_MUTATORS),
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    91
                // use only this type of mutators
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    92
                Utils.getRandomElement(signMutators));
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    93
        return makeMethodDescriptor(executable, patterns,
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    94
                separators, mutators);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    95
    }
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    96
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    97
    /**
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    98
     * Compile command signature that looks like java/lang/String.indexOf
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
    99
     * http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BABDDFII
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   100
     *
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   101
     * @param executable executable used to generate descriptor
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   102
     * @return MethodDescriptor instance
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   103
     */
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   104
    public static MethodDescriptor commandDescriptor(Executable executable) {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   105
        MethodDescriptor md = new MethodDescriptor(executable);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   106
        md.aClass.setSeparator(Separator.SLASH);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   107
        md.aMethod.setSeparator(Separator.DOT);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   108
        md.aSignature.setSeparator(Separator.NONE);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   109
        return md;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   110
    }
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   111
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   112
    /**
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   113
     * Compile command signature that looks like java.lang.String::indexOf
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   114
     *
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   115
     * @param executable executable used to generate descriptor
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   116
     * @return MethodDescriptor instance
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   117
     */
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   118
    public static MethodDescriptor logDescriptor(Executable executable) {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   119
        MethodDescriptor md = new MethodDescriptor(executable);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   120
        md.aClass.setSeparator(Separator.DOT);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   121
        md.aMethod.setSeparator(Separator.DOUBLECOLON);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   122
        md.aSignature.setSeparator(Separator.NONE);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   123
        return md;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   124
    }
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   125
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   126
    /**
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   127
     * Generates a list of method patterns from the pool of methods
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   128
     *
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   129
     * @return a list of test cases
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   130
     */
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   131
    public List<MethodDescriptor> getTests() {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   132
        List<MethodDescriptor> list = new ArrayList<>();
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   133
        METHODS.forEach(pair -> list.addAll(getTests(pair.first)));
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   134
        return list;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   135
    }
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   136
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   137
    /**
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   138
     * Generates all combinations of method descriptors for a given executable
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   139
     *
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   140
     * @param executable executable for which the different combination is built
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   141
     * @return list of method descriptors
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   142
     */
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   143
    public List<MethodDescriptor> getTests(Executable executable) {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   144
        List<MethodDescriptor> list = new ArrayList<>();
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   145
        for (Combination<PatternType> patterns : PATTERNS_LIST) {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   146
            for (Combination<Separator> separators : SEPARATORS_LIST) {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   147
                for (Function<String, String> classGen : ELEMENT_MUTATORS) {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   148
                    for (Function<String, String> methodGen :
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   149
                            ELEMENT_MUTATORS) {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   150
                        for (Function<String, String> signatureGen :
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   151
                                ELEMENT_MUTATORS) {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   152
                            list.add(makeMethodDescriptor(executable,
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   153
                                    patterns, separators,
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   154
                                    new Combination<>(classGen, methodGen,
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   155
                                        signatureGen)));
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   156
                        }
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   157
                    }
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   158
                }
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   159
            }
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   160
        }
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   161
        return list;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   162
    }
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   163
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   164
    /**
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   165
     * Creates method descriptor from the given executable,
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   166
     * patterns and separators for its elements
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   167
     */
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   168
    private MethodDescriptor makeMethodDescriptor(
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   169
            Executable executable,
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   170
            Combination<PatternType> patterns,
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   171
            Combination<Separator> separators,
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   172
            Combination<Function<String, String>> mutators) {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   173
        MethodDescriptor methodDescriptor = new MethodDescriptor(executable);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   174
        methodDescriptor.setSeparators(separators);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   175
        methodDescriptor.applyMutates(mutators);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   176
        methodDescriptor.setPatterns(patterns);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   177
        return methodDescriptor;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   178
    }
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   179
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   180
    /**
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   181
     * Creates a list of functions that change given string
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   182
     */
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   183
    private static List<Function<String, String>> generateMutators() {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   184
        List<Function<String, String>> elements = new ArrayList<>();
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   185
        // Use the input itself
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   186
        elements.add(input -> input);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   187
        // Use half of the input string
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   188
        elements.add(input -> input.substring(input.length() / 2));
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   189
        // Add nonexistent element
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   190
        elements.add(input -> "nonexistent");
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   191
        // Use left and right angle brackets
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   192
        elements.add(input -> "<" + input + ">");
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   193
        // Embed * inside
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   194
        elements.add(input -> embed(input, "*"));
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   195
        // ** as a whole element
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   196
        elements.add(input -> "**");
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   197
        // Embed JLS-invalid letters
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   198
        elements.add(input -> embed(input, "@%"));
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   199
        elements.add(input -> embed(input, "]"));
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   200
        // Use JLS-invalid letters
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   201
        elements.add(input -> "-");
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   202
        elements.add(input -> "+");
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   203
        elements.add(input -> ")" + input);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   204
        elements.add(input -> "{" + input + "}");
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   205
        // Add valid Java identifier start char
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   206
        elements.add(input -> "_" + input);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   207
        elements.add(input -> "$" + input);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   208
        elements.add(input -> "0" + input);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   209
        // Unicode characters
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   210
        elements.add(input -> embed(input, "\u0001"));
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   211
        elements.add(input -> embed(input, "\u007F"));
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   212
        // Combining character
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   213
        elements.add(input -> embed(input, "\u0300"));
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   214
        elements.add(input -> embed(input, "\u0306"));
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   215
        // Supplementary character
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   216
        elements.add(input -> new String(Character.toChars(0x1F64C)));
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   217
        return elements;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   218
    }
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   219
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   220
    /**
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   221
     * Embeds one string inside another one
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   222
     *
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   223
     * @param target  target source string
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   224
     * @param element string to be embedded into target string
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   225
     * @return result string
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   226
     */
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   227
    private static String embed(String target, String element) {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   228
        int mid = target.length() / 2;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   229
        String begin = target.substring(0, mid);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   230
        String end = target.substring(mid);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   231
        return begin + element + end;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   232
    }
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   233
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   234
    /**
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   235
     * Generates triples from the given enum sets
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   236
     * for each of the method elements
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   237
     *
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   238
     * @param classSet  set of allowed elements for class
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   239
     * @param methodSet set of allowed elements for method
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   240
     * @param signSet   set of allowed elements for signature
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   241
     * @param <E>       type of generated triples
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   242
     * @return list of triples
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   243
     */
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   244
    private static <E extends Enum<E>> List<Combination<E>> generate(
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   245
            EnumSet<E> classSet, EnumSet<E> methodSet, EnumSet<E> signSet) {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   246
        List<Combination<E>> list = new ArrayList<>();
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   247
        classSet.forEach(clsElement ->
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   248
            methodSet.forEach(methodElement ->
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   249
                signSet.forEach(signElement ->
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   250
                    list.add(new Combination<>(clsElement, methodElement,
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   251
                            signElement))
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   252
                )
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   253
            )
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   254
        );
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   255
        return list;
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   256
    }
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   257
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   258
    private static class Combination<T> extends Triple<T, T, T> {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   259
        public Combination(T first, T second, T third) {
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   260
            super(first, second, third);
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   261
        }
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   262
    }
71794b149055 8066157: JEP-JDK-8046155: Test task: method matcher
ppunegov
parents:
diff changeset
   263
}