test/langtools/tools/javac/switchexpr/ExpressionSwitch.java
author darcy
Thu, 13 Dec 2018 19:06:11 +0100
changeset 53023 6879069d9d94
parent 52794 e4ba5414c8b4
child 53878 4584d0331318
permissions -rw-r--r--
8205626: Start of release updates for JDK 13 8205393: Add SourceVersion.RELEASE_13 8205394: Add source 13 and target 13 to javac 8205645: Bump maximum recognized class file version to 57 for JDK 13 8214825: Update preview language features for start of JDK 13 Reviewed-by: erikj, alanb, mchung, mcimadamore, dholmes, smarks, jjg
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
     1
/*
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
     2
 * @test /nodynamiccopyright/
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
     3
 * @bug 8206986
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
     4
 * @summary Check expression switch works.
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
     5
 * @compile/fail/ref=ExpressionSwitch-old.out -source 9 -Xlint:-options -XDrawDiagnostics ExpressionSwitch.java
53023
6879069d9d94 8205626: Start of release updates for JDK 13
darcy
parents: 52794
diff changeset
     6
 * @compile --enable-preview -source 13 ExpressionSwitch.java
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
     7
 * @run main/othervm --enable-preview ExpressionSwitch
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
     8
 */
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
     9
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    10
import java.util.Objects;
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    11
import java.util.function.Supplier;
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    12
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    13
public class ExpressionSwitch {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    14
    public static void main(String... args) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    15
        new ExpressionSwitch().run();
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    16
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    17
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    18
    private void run() {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    19
        check(T.A, "A");
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    20
        check(T.B, "B");
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    21
        check(T.C, "other");
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    22
        assertEquals(exhaustive1(T.C), "C");
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    23
        assertEquals(scopesIsolated(T.B), "B");
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    24
        assertEquals(lambdas1(T.B).get(), "B");
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    25
        assertEquals(lambdas2(T.B).get(), "B");
52794
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    26
        assertEquals(convert1("A"), 0);
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    27
        assertEquals(convert1("B"), 0);
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    28
        assertEquals(convert1("C"), 1);
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    29
        assertEquals(convert1(""), -1);
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    30
        assertEquals(convert2("A"), 0);
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    31
        assertEquals(convert2("B"), 0);
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    32
        assertEquals(convert2("C"), 1);
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    33
        assertEquals(convert2(""), -1);
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    34
        localClass(T.A);
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    35
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    36
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    37
    private String print(T t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    38
        return switch (t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    39
            case A -> "A";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    40
            case B -> { break "B"; }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    41
            default -> { break "other"; }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    42
        };
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    43
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    44
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    45
    private String exhaustive1(T t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    46
        return switch (t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    47
            case A -> "A";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    48
            case B -> { break "B"; }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    49
            case C -> "C";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    50
            case D -> "D";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    51
        };
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    52
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    53
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    54
    private String exhaustive2(T t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    55
        return switch (t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    56
            case A -> "A";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    57
            case B -> "B";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    58
            case C -> "C";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    59
            case D -> "D";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    60
        };
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    61
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    62
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    63
    private String scopesIsolated(T t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    64
        return switch (t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    65
            case A -> { String res = "A"; break res;}
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    66
            case B -> { String res = "B"; break res;}
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    67
            default -> { String res = "default"; break res;}
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    68
        };
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    69
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    70
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    71
    private Supplier<String> lambdas1(T t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    72
        return switch (t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    73
            case A -> () -> "A";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    74
            case B -> { break () -> "B"; }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    75
            default -> () -> "default";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    76
        };
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    77
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    78
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    79
    private Supplier<String> lambdas2(T t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    80
        return switch (t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    81
            case A: break () -> "A";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    82
            case B: { break () -> "B"; }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    83
            default: break () -> "default";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    84
        };
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    85
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
    86
52794
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    87
    private int convert1(String s) {
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    88
        return switch (s) {
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    89
            case "A", "B" -> 0;
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    90
            case "C" -> { break 1; }
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    91
            default -> -1;
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    92
        };
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    93
    }
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    94
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    95
    private int convert2(String s) {
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    96
        return switch (s) {
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    97
            case "A", "B": break 0;
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    98
            case "C": break 1;
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
    99
            default: break -1;
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
   100
        };
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
   101
    }
e4ba5414c8b4 8214031: Assertion error in value break statement with conditional operator in switch expression
jlahoda
parents: 51563
diff changeset
   102
51563
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   103
    private void localClass(T t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   104
        String good = "good";
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   105
        class L {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   106
            public String c() {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   107
                STOP: switch (t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   108
                    default: break STOP;
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   109
                }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   110
                return switch (t) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   111
                    default: break good;
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   112
                };
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   113
            }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   114
        }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   115
        String result = new L().c();
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   116
        if (!Objects.equals(result, good)) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   117
            throw new AssertionError("Unexpected result: " + result);
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   118
        }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   119
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   120
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   121
    private void check(T t, String expected) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   122
        String result = print(t);
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   123
        assertEquals(result, expected);
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   124
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   125
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   126
    private void assertEquals(Object result, Object expected) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   127
        if (!Objects.equals(result, expected)) {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   128
            throw new AssertionError("Unexpected result: " + result);
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   129
        }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   130
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   131
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   132
    enum T {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   133
        A, B, C, D;
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   134
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   135
    void t() {
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   136
        Runnable r = () -> {};
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   137
        r.run();
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   138
    }
de411d537aae 8206986: Compiler support for Switch Expressions (Preview)
jlahoda
parents:
diff changeset
   139
}