test/langtools/tools/javac/switchextra/SwitchStatementArrow.java
author darcy
Thu, 21 Feb 2019 10:29:16 -0800
changeset 53878 4584d0331318
parent 53023 6879069d9d94
child 59021 cfc7bb9a5a92
permissions -rw-r--r--
8219254: Update explicit uses of latest source/target in langtools tests to a property 8219256: Update javac diags tests to use properties Reviewed-by: jjg, jlahoda, darcy, iignatyev Contributed-by: joe.darcy@oracle.com, jonathan.gibbons@oracle.com

/*
 * @test /nodymaticcopyright/
 * @bug 8206986
 * @summary Verify rule cases work properly.
 * @compile/fail/ref=SwitchStatementArrow-old.out -source 9 -Xlint:-options -XDrawDiagnostics SwitchStatementArrow.java
 * @compile --enable-preview -source ${jdk.version} SwitchStatementArrow.java
 * @run main/othervm --enable-preview SwitchStatementArrow
 */

import java.util.Objects;
import java.util.function.Function;

public class SwitchStatementArrow {
    public static void main(String... args) {
        new SwitchStatementArrow().run();
    }

    private void run() {
        runTest(this::statement1);
        runTest(this::scope);
    }

    private void runTest(Function<T, String> print) {
        check(T.A,  print, "A");
        check(T.B,  print, "B-C");
        check(T.C,  print, "B-C");
        try {
            print.apply(T.D);
            throw new AssertionError();
        } catch (IllegalStateException ex) {
            if (!Objects.equals("D", ex.getMessage()))
                throw new AssertionError(ex);
        }
        check(T.E,  print, "other");
    }

    private String statement1(T t) {
        String res;

        switch (t) {
            case A -> { res = "A"; }
            case B, C -> res = "B-C";
            case D -> throw new IllegalStateException("D");
            default -> { res = "other"; break; }
        }

        return res;
    }

    private String scope(T t) {
        String res;

        switch (t) {
            case A -> { String r = "A"; res = r; }
            case B, C -> {String r = "B-C"; res = r; }
            case D -> throw new IllegalStateException("D");
            default -> { String r = "other"; res = r; break; }
        }

        return res;
    }

    private int r;

    private void check(T t, Function<T, String> print, String expected) {
        String result = print.apply(t);
        if (!Objects.equals(result, expected)) {
            throw new AssertionError("Unexpected result: " + result);
        }
    }

    enum T {
        A, B, C, D, E;
    }
}