/*
 * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/**
 * @test
 * @summary Test implicit String concatenations, multiple shapes.
 * @bug 8148483 8245959 8247681
 *
 * @compile ImplicitStringConcatShapes.java
 * @run main/othervm -Xverify:all ImplicitStringConcatShapes
 *
 * @compile -XDstringConcat=inline ImplicitStringConcatShapes.java
 * @run main/othervm -Xverify:all ImplicitStringConcatShapes
 *
 * @compile -XDstringConcat=indy ImplicitStringConcatShapes.java
 * @run main/othervm -Xverify:all ImplicitStringConcatShapes
 *
 * @compile -XDstringConcat=indyWithConstants ImplicitStringConcatShapes.java
 * @run main/othervm -Xverify:all ImplicitStringConcatShapes
*/
public class ImplicitStringConcatShapes {
    public static void test(String expected, String actual) {
        // Fingers crossed: String concat should work.
        if (!expected.equals(actual)) {
            StringBuilder sb = new StringBuilder();
            sb.append("Expected = ");
            sb.append(expected);
            sb.append(", actual = ");
            sb.append(actual);
            throw new IllegalStateException(sb.toString());
        }
    }

    static class MyClass {
        private final int i;

        public MyClass(int i) {
            this.i = i;
        }

        public String toString() {
            return new StringBuilder("C(").append(i).append(")").toString();
        }
    }

    static class MyClassNullToString {
        public String toString() {
            return null;
        }
    }

    public static void main(String[] args) throws Exception {
        new ImplicitStringConcatShapes().run();
    }
