/*
 * Copyright (c) 2017, 2024, 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
 * @bug 8166334 8188894
 * @summary test shift-tab shortcuts "fixes"
 * @modules
 *     jdk.jshell/jdk.internal.jshell.tool:open
 *     jdk.jshell/jdk.internal.jshell.tool.resources:open
 *     jdk.jshell/jdk.jshell:open
 * @build UITesting
 * @build ToolShiftTabTest
 * @run testng/timeout=300 ToolShiftTabTest
 */

import java.util.regex.Pattern;
import org.testng.annotations.Test;

@Test
public class ToolShiftTabTest extends UITesting {

    // Shift-tab as escape sequence
    private String FIX = "\033\133\132";

    public void testFixVariable() throws Exception {
        doRunTest((inputSink, out) -> {
            inputSink.write("3+4");
            inputSink.write(FIX + "v");
            inputSink.write("jj\n");
            waitOutput(out, "jj ==> 7");
            inputSink.write("jj\n");
            waitOutput(out, "jj ==> 7");
        });
    }

    public void testFixMethod() throws Exception {
        doRunTest((inputSink, out) -> {
            inputSink.write("5.5 >= 3.1415926535");
            inputSink.write(FIX + "m");
            waitOutput(out, "boolean ");
            inputSink.write("mm\n");
            waitOutput(out, "|  created method mm()");
            inputSink.write("mm()\n");
            waitOutput(out, "==> true");
            inputSink.write("/method\n");
            waitOutput(out, "boolean mm()");
        });
    }

    public void testFixMethodVoid() throws Exception {
        doRunTest((inputSink, out) -> {
            inputSink.write("System.out.println(\"Testing\")");
            inputSink.write(FIX + "m");
            inputSink.write("p\n");
            waitOutput(out, "|  created method p()");
            inputSink.write("p()\n");
            waitOutput(out, "Testing");
            inputSink.write("/method\n");
            waitOutput(out, "void p()");
        });
    }

    public void testFixMethodNoLeaks() throws Exception {
        doRunTest((inputSink, out) -> {
            inputSink.write("4");
            inputSink.write(FIX + "m");
            inputSink.write(INTERRUPT + " 55");
            inputSink.write(FIX + "m");
            inputSink.write(INTERRUPT + " 55");
            inputSink.write(FIX + "m");
            inputSink.write(INTERRUPT + " 55");
            inputSink.write(FIX + "m");
            inputSink.write(INTERRUPT + " 55");
            inputSink.write(FIX + "m");
            inputSink.write(INTERRUPT + "'X'");
            inputSink.write(FIX + "m");
            inputSink.write("nl\n");
            waitOutput(out, "|  created method nl()");
            inputSink.write("/list\n");
            waitOutput(out, Pattern.quote("1 : char nl() { return 'X'; }"));
            inputSink.write("true\n");
            waitOutput(out, Pattern.quote("$2 ==> true"));
            inputSink.write("/list\n");
            waitOutput(out, "2 : true");
        });
    }

    public void testFixImport() throws Exception {
        doRunTest((inputSink, out) -> {
            inputSink.write("Frame");
            inputSink.write(FIX + "i");
            while (!waitOutput(out, "java.awt.Frame", "Results may be incomplete")) {
                Thread.sleep(1000);
                inputSink.write(FIX + "i");
            }
            inputSink.write("1");
            inputSink.write(".WIDTH\n");
            waitOutput(out, "==> 1");
            inputSink.write("/import\n");
            waitOutput(out, "|    import java.awt.Frame");

            inputSink.write("Object");
            inputSink.write(FIX + "i");
            waitOutput(out, "The identifier is resolvable in this context");
        });
    }

    public void testFixBad() throws Exception {
        doRunTest((inputSink, out) -> {
            inputSink.write("123");
            inputSink.write(FIX + "z");
            waitOutput(out, "Unexpected character after Shift\\+Tab");
        });
    }
}
