/*
 * Copyright (c) 2016, 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 8148316 8148317 8151755 8152246 8153551 8154812 8157261 8163840 8166637 8161969 8173007 8299829
 * @summary Tests for output customization
 * @library /tools/lib
 * @modules jdk.compiler/com.sun.tools.javac.api
 *          jdk.compiler/com.sun.tools.javac.main
 *          jdk.jdeps/com.sun.tools.javap
 *          jdk.jshell/jdk.internal.jshell.tool
 * @build KullaTesting TestingInputStream toolbox.ToolBox Compiler
 * @run testng ToolFormatTest
 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;

@Test
public class ToolFormatTest extends ReplToolTesting {

    public void testSetFormat() {
        try {
            test(
                    (a) -> assertCommandOutputStartsWith(a, "/set mode test -command", "|  Created new feedback mode: test"),
                    (a) -> assertCommand(a, "/set format test pre '$ '", ""),
                    (a) -> assertCommand(a, "/set format test post ''", ""),
                    (a) -> assertCommand(a, "/set format test act 'ADD' added", ""),
                    (a) -> assertCommand(a, "/set format test act 'MOD' modified", ""),
                    (a) -> assertCommand(a, "/set format test act 'REP' replaced", ""),
                    (a) -> assertCommand(a, "/set format test act 'OVR' overwrote", ""),
                    (a) -> assertCommand(a, "/set format test act 'USE' used", ""),
                    (a) -> assertCommand(a, "/set format test act 'DRP' dropped", ""),
                    (a) -> assertCommand(a, "/set format test up 'UP-' update", ""),
                    (a) -> assertCommand(a, "/set format test action '{up}{act} '", ""),
                    (a) -> assertCommand(a, "/set format test resolve 'OK' ok", ""),
                    (a) -> assertCommand(a, "/set format test resolve 'DEF' defined", ""),
                    (a) -> assertCommand(a, "/set format test resolve 'NODEF' notdefined", ""),
                    (a) -> assertCommand(a, "/set format test fname ':{name} ' ", ""),
                    (a) -> assertCommand(a, "/set format test ftype '[{type}]' method,expression", ""),
                    (a) -> assertCommand(a, "/set format test result '={value} ' expression", ""),
                    (a) -> assertCommand(a, "/set format test display '{pre}{action}{ftype}{fname}{result}{resolve}'", ""),
                    (a) -> assertCommand(a, "/set format test display '{pre}HI this is enum' enum", ""),
                    (a) -> assertCommandOutputStartsWith(a, "/set feedback test", "$ Feedback mode: test"),
                    (a) -> assertCommand(a, "class D {}", "$ ADD :D OK"),
                    (a) -> assertCommand(a, "void m() {}", "$ ADD []:m OK"),
                    (a) -> assertCommand(a, "interface EX extends EEX {}", "$ ADD :EX NODEF"),
                    (a) -> assertCommand(a, "56", "$ ADD [int]:$4 =56 OK"),
                    (a) -> assertCommand(a, "class D { int hh; }", "$ REP :D OK$ UP-OVR :D OK"),
                    (a) -> assertCommand(a, "enum E {A,B}", "$ HI this is enum"),
                    (a) -> assertCommand(a, "int z() { return f(); }", "$ ADD []:z DEF"),
                    (a) -> assertCommand(a, "z()", "$ UP-USE []:z DEF"),
                    (a) -> assertCommand(a, "/drop z", "$ DRP []:z OK"),
                    (a) -> assertCommandOutputStartsWith(a, "/set feedback normal", "|  Feedback mode: normal")
            );
        } finally {
            assertCommandCheckOutput(false, "/set feedback normal", s -> {
            });
        }
    }

    public void testSetFormatOverride() {
        test(
                (a) -> assertCommand(a, "/set mode tm -c", "|  Created new feedback mode: tm"),
                (a) -> assertCommand(a, "/se fo tm x \"aaa\"", ""),
                (a) -> assertCommand(a, "/se fo tm x \"bbb\" class,method-added", ""),
                (a) -> assertCommand(a, "/se fo tm x",
                        "|  /set format tm x \"aaa\" \n" +
                        "|  /set format tm x \"bbb\" class,method-added"),
                (a) -> assertCommand(a, "/se fo tm x \"ccc\" class,method-added,modified", ""),
                (a) -> assertCommand(a, "/se fo tm x \"ddd\" class,method-added", ""),
                (a) -> assertCommand(a, "/se fo tm x \"eee\" method-added", ""),
                (a) -> assertCommand(a, "/se fo tm x",
                        "|  /set format tm x \"aaa\" \n" +
                        "|  /set format tm x \"ccc\" class,method-added,modified\n" +
                        "|  /set format tm x \"ddd\" class,method-added\n" +
                        "|  /set format tm x \"eee\" method-added"),
                (a) -> assertCommand(a, "/se fo tm x \"EEE\" method-added,replaced", ""),
                (a) -> assertCommand(a, "/se fo tm x",
                        "|  /set format tm x \"aaa\" \n" +
                        "|  /set format tm x \"ccc\" class,method-added,modified\n" +
                        "|  /set format tm x \"ddd\" class,method-added\n" +
                        "|  /set format tm x \"EEE\" method-added,replaced"),
                (a) -> assertCommand(a, "/se fo tm x \"fff\" method-added,replaced-ok", ""),
                (a) -> assertCommand(a, "/se fo tm x",
                        "|  /set format tm x \"aaa\" \n" +
                        "|  /set format tm x \"ccc\" class,method-added,modified\n" +
                        "|  /set format tm x \"ddd\" class,method-added\n" +
                        "|  /set format tm x \"EEE\" method-added,replaced\n" +
                        "|  /set format tm x \"fff\" method-added,replaced-ok"),
                (a) -> assertCommand(a, "/se fo tm x \"ggg\" method-ok", ""),
                (a) -> assertCommand(a, "/se fo tm x",
                        "|  /set format tm x \"aaa\" \n" +
                        "|  /set format tm x \"ccc\" class,method-added,modified\n" +
                        "|  /set format tm x \"ddd\" class,method-added\n" +
                        "|  /set format tm x \"EEE\" method-added,replaced\n" +
                        "|  /set format tm x \"ggg\" method-ok"),
                (a) -> assertCommand(a, "/se fo tm x \"hhh\" method", ""),
                (a) -> assertCommand(a, "/se fo tm x",
                        "|  /set format tm x \"aaa\" \n" +
                        "|  /set format tm x \"ccc\" class,method-added,modified\n" +
                        "|  /set format tm x \"ddd\" class,method-added\n" +
                        "|  /set format tm x \"hhh\" method"),
                (a) -> assertCommand(a, "/se fo tm x \"iii\" method,class", ""),
                (a) -> assertCommand(a, "/se fo tm x",
                        "|  /set format tm x \"aaa\" \n" +
                        "|  /set format tm x \"iii\" method,class"),
                (a) -> assertCommand(a, "/se fo tm x \"jjj\"", ""),
                (a) -> assertCommand(a, "/se fo tm x",
                        "|  /set format tm x \"jjj\"")
        );
    }

    public void testSetFormatSelectorSample() {
        test(
                (a) -> assertCommandOutputStartsWith(a, "/set mode ate -quiet",
                            "|  Created new feedback mode: ate"),
                (a) -> assertCommand(a, "/set feedback ate", ""),

                (a) -> assertCommand(a, "/set format ate display '---replaced,modified,added-primary---'", ""),
                (a) -> assertCommand(a, "/set format ate display '+++replaced,modified,added-primary+++' replaced,modified,added-primary", ""),
                (a) -> assertCommand(a, "\"replaced,modified,added-primary\"", "+++replaced,modified,added-primary+++"),

                (a) -> assertCommand(a, "/set format ate display '---added-primary,update---'", ""),
                (a) -> assertCommand(a, "/set format ate display '+++added-primary,update+++' added-primary,update", ""),
                (a) -> assertCommand(a, "\"added-primary,update\"", "+++added-primary,update+++"),


                (a) -> assertCommand(a, "/set format ate display '---method-replaced-primary---'", ""),
                (a) -> assertCommand(a, "/set format ate display '+++method-replaced-primary+++' method-replaced-primary", ""),
                (a) -> assertCommand(a, "\"method-replaced-primary\"", "---method-replaced-primary---"),

                (a) -> assertCommand(a, "/set format ate display '---method-replaced-update---'", ""),
                (a) -> assertCommand(a, "/set format ate display '+++method-replaced-update+++' method-replaced-update", ""),
                (a) -> assertCommand(a, "\"method-replaced-update\"", "---method-replaced-update---"),

                (a) -> assertCommand(a, "/set format ate display '---method-added-update---'", ""),
                (a) -> assertCommand(a, "/set format ate display '+++method-added-update+++' method-added-update", ""),
                (a) -> assertCommand(a, "\"method-added-update\"", "---method-added-update---"),

                (a) -> assertCommand(a, "/set format ate display '---method-added---'", ""),
                (a) -> assertCommand(a, "/set format ate display '+++method-added+++' method-added", ""),
                (a) -> assertCommand(a, "\"method-added\"", "---method-added---"),

                (a) -> assertCommand(a, "/set format ate display '---class-modified,added-primary,update---'", ""),
                (a) -> assertCommand(a, "/set format ate display '+++class-modified,added-primary,update+++' class-modified,added-primary,update", ""),
                (a) -> assertCommand(a, "\"class-modified,added-primary,update\"", "---class-modified,added-primary,update---"),

                (a) -> assertCommand(a, "/set format ate display '---class-modified,added-primary---'", ""),
                (a) -> assertCommand(a, "/set format ate display '+++class-modified,added-primary+++' class-modified,added-primary", ""),
                (a) -> assertCommand(a, "\"class-modified,added-primary\"", "---class-modified,added-primary---"),

                (a) -> assertCommand(a, "/set format ate display '---class-modified,added-update---'", ""),
                (a) -> assertCommand(a, "/set format ate display '+++class-modified,added-update+++' class-modified,added-update", ""),
                (a) -> assertCommand(a, "\"class-modified,added-update\"", "---class-modified,added-update---"),

                (a) -> assertCommand(a, "/set format ate display '---replaced,added---'", ""),
                (a) -> assertCommand(a, "/set format ate display '+++replaced,added+++' replaced,added", ""),
                (a) -> assertCommand(a, "\"replaced,added\"", "+++replaced,added+++"),

                (a) -> assertCommand(a, "/set format ate display '---replaced-primary,update---'", ""),
                (a) -> assertCommand(a, "/set format ate display '+++replaced-primary,update+++' replaced-primary,update", ""),
                (a) -> assertCommand(a, "\"replaced-primary,update\"", "---replaced-primary,update---"),

                (a) -> assertCommandOutputStartsWith(a, "/set feedback normal", "|  Feedback mode: normal")
        );
    }

    // This test is exhaustive and takes to long for routine testing -- disabled.
    // A sampling of these has been added (above: testSetFormatSelectorSample).
    // See 8173007
    // Save for possible future deep testing or debugging
    @Test(enabled = false)
    public void testSetFormatSelector() {
        List<ReplTest> tests = new ArrayList<>();
        tests.add((a) -> assertCommandOutputStartsWith(a, "/set mode ate -quiet",
                            "|  Created new feedback mode: ate"));
        tests.add((a) -> assertCommand(a, "/set feedback ate", ""));
        StringBuilder sb = new StringBuilder();
        class KindList {
            final String[] values;
            final int matchIndex;
            int current;
            boolean match;
            KindList(String[] values, int matchIndex) {
                this.values = values;
                this.matchIndex = matchIndex;
                this.current = 1 << values.length;
            }
            boolean next() {
                if (current <= 0) {
                    return false;
                }
                --current;
                return true;
            }
            boolean append(boolean ahead) {
                boolean any = false;
                match = false;
                for (int i = values.length - 1; i >= 0 ; --i) {
                    if ((current & (1 << i)) != 0) {
                        match |= i == matchIndex;
                        if (any) {
                            sb.append(",");
                        } else {
                            if (ahead) {
                                sb.append("-");
                            }
                        }
                        sb.append(values[i]);
                        any = true;
                    }
                }
                match |= !any;
                return ahead || any;
            }
        }
        KindList klcase = new KindList(new String[] {"class", "method", "expression", "vardecl"}, 2);
        while (klcase.next()) {
            KindList klact  = new KindList(new String[] {"added", "modified", "replaced"}, 0);
            while (klact.next()) {
                KindList klwhen = new KindList(new String[] {"update", "primary"}, 1);
                while (klwhen.next()) {
                    sb.setLength(0);
                    klwhen.append(
                        klact.append(
                            klcase.append(false)));
                    boolean match = klcase.match && klact.match && klwhen.match;
                    String select = sb.toString();
                    String yes = "+++" + select + "+++";
                    String no  = "---" + select + "---";
                    String expect = match? yes : no;
                    tests.add((a) -> assertCommand(a, "/set format ate display '" + no  + "'", ""));
                    tests.add((a) -> assertCommand(a, "/set format ate display '" + yes + "' " + select, ""));
                    tests.add((a) -> assertCommand(a, "\"" + select + "\"", expect));
             /**** for sample generation ****
             System.err.println("                (a) -> assertCommand(a, \"/set format ate display '" + no  + "'\", \"\"),");
             System.err.println("                (a) -> assertCommand(a, \"/set format ate display '" + yes + "' " + select + "\", \"\"),");
             System.err.println("                (a) -> assertCommand(a, \"\\\"" + select + "\\\"\", \"" + expect + "\"),\n");
             ****/
                }
            }
        }
        tests.add((a) -> assertCommandOutputStartsWith(a, "/set feedback normal", "|  Feedback mode: normal"));

        try {
            test(tests.toArray(new ReplTest[tests.size()]));
        } finally {
            assertCommandCheckOutput(false, "/set feedback normal", s -> {
            });
        }
    }

    public void testSetTruncation() {
        try {
            test(
                    (a) -> assertCommandOutputStartsWith(a, "/set feedback normal", ""),
                    (a) -> assertCommand(a, "String s = java.util.stream.IntStream.range(65, 74)"+
                            ".mapToObj(i -> \"\"+(char)i).reduce((a,b) -> a + b + a).get() + \"XYZ\"",
                            "s ==> \"ABACABADABACABAEABACABADABACABAFABACABADABACABAE ... BACABAEABACABADABACABAXYZ\""),
                    (a) -> assertCommandOutputStartsWith(a, "/set mode test -quiet", ""),
                    (a) -> assertCommandOutputStartsWith(a, "/set feedback test", ""),
                    (a) -> assertCommand(a, "/set format test display '{type}:{value}' primary", ""),
                    (a) -> assertCommand(a, "/set truncation test 20", ""),
                    (a) -> assertCommand(a, "/set truncation test", "|  /set truncation test 20"),
                    (a) -> assertCommandOutputContains(a, "/set truncation", "/set truncation test 20"),
                    (a) -> assertCommand(a, "/set trunc test 10 varvalue", ""),
                    (a) -> assertCommand(a, "/set trunc test 3 assignment", ""),
                    (a) -> assertCommandOutputContains(a, "/set truncation",
                            "/set truncation test 10 varvalue"),
                    (a) -> assertCommandOutputContains(a, "/set truncation test",
                            "/set truncation test 10 varvalue"),
                    (a) -> assertCommand(a, "/var", "|    String s = \"ABACABADA"),
                    (a) -> assertCommand(a, "String r = s", "String:\"ABACABAD ... BAXYZ\""),
                    (a) -> assertCommand(a, "r", "String:\"ABACABADA"),
                    (a) -> assertCommand(a, "r=s", "String:\"AB"),
                    (a) -> assertCommand(a, "\"0\".repeat(49999)+\"2\"", "String:\"00000000 ... 00002\"")
            );
        } finally {
            assertCommandCheckOutput(false, "/set feedback normal", s -> {
            });
        }
    }

    public void testDefaultTruncation() {
        test(
                    (a) -> assertCommand(a, "char[] cs = new char[2000];", null),
                    (a) -> assertCommand(a, "Arrays.fill(cs, 'A');", ""),
                    (a) -> assertCommandCheckOutput(a, "String s = new String(cs)",
                            (s) -> {
                                assertTrue(s.length() < 120, "Result too long (" + s.length() + ") -- " + s);
                                assertTrue(s.contains("AAAAAAAAAAAAAAAAAA"), "Bad value: " + s);
                            }),
                    (a) -> assertCommandCheckOutput(a, "s",
                            (s) -> {
                                assertTrue(s.length() > 300, "Result too short (" + s.length() + ") -- " + s);
                                assertTrue(s.contains("AAAAAAAAAAAAAAAAAA"), "Bad value: " + s);
                            }),
                    (a) -> assertCommandCheckOutput(a, "\"X\" + s",
                            (s) -> {
                                assertTrue(s.length() > 300, "Result too short (" + s.length() + ") -- " + s);
                                assertTrue(s.contains("XAAAAAAAAAAAAAAAAAA"), "Bad value: " + s);
                            })
        );
    }

    public void testPrompt() {
        test(
                (a) -> assertCommand(a, "/set mode tp -quiet", "|  Created new feedback mode: tp"),
                (a) -> assertCommand(a, "/set prompt tp 'aaa' 'bbb'", ""),
                (a) -> assertCommand(a, "/set prompt tp",
                        "|  /set prompt tp \"aaa\" \"bbb\""),
                (a) -> assertCommandOutputContains(a, "/set prompt",
                        "|  /set prompt tp \"aaa\" \"bbb\""),
                (a) -> assertCommand(a, "/set mode -retain tp", ""),
                (a) -> assertCommand(a, "/set prompt tp 'ccc' 'ddd'", ""),
                (a) -> assertCommand(a, "/set prompt tp",
                        "|  /set prompt tp \"ccc\" \"ddd\""),
                (a) -> assertCommandCheckOutput(a, "/set mode tp",
                        (s) -> {
                            try {
                                BufferedReader rdr = new BufferedReader(new StringReader(s));
                                assertEquals(rdr.readLine(), "|  /set mode tp -quiet",
                                        "|  /set mode tp -quiet");
                                assertEquals(rdr.readLine(), "|  /set prompt tp \"aaa\" \"bbb\"",
                                        "|  /set prompt tp \"aaa\" \"bbb\"");
                                String l = rdr.readLine();
                                while (l.startsWith("|  /set format tp ")) {
                                    l = rdr.readLine();
                                }
                                assertEquals(l, "|  /set mode -retain tp",
                                        "|  /set mode -retain tp");
                                assertEquals(rdr.readLine(), "|  ",
                                        "|  ");
                                assertEquals(rdr.readLine(), "|  /set mode tp -quiet",
                                        "|  /set mode tp -quiet");
                                assertEquals(rdr.readLine(), "|  /set prompt tp \"ccc\" \"ddd\"",
                                        "|  /set prompt tp \"ccc\" \"ddd\"");
                            } catch (IOException ex) {
                                fail("threw " + ex);
                            }
                        })
        );
    }

    public void testShowFeedbackModes() {
        test(
                (a) -> assertCommandOutputContains(a, "/set feedback", "normal")
        );
    }

    public void testSetNewModeQuiet() {
        try {
            test(
                    (a) -> assertCommandOutputStartsWith(a, "/set mode nmq -quiet normal", "|  Created new feedback mode: nmq"),
                    (a) -> assertCommand(a, "/set feedback nmq", ""),
                    (a) -> assertCommand(a, "/se mo nmq2 -q nor", ""),
                    (a) -> assertCommand(a, "/se fee nmq2", ""),
                    (a) -> assertCommand(a, "/set mode nmc -command normal", ""),
                    (a) -> assertCommandOutputStartsWith(a, "/set feedback nmc", "|  Feedback mode: nmc"),
                    (a) -> assertCommandOutputStartsWith(a, "/set mode nm -command",
                            "|  Created new feedback mode: nm"),
                    (a) -> assertCommandOutputStartsWith(a, "/set feedback nm", "|  Feedback mode: nm"),
                    (a) -> assertCommandOutputStartsWith(a, "/set feedback normal", "|  Feedback mode: normal")
            );
        } finally {
            assertCommandCheckOutput(false, "/set feedback normal", s -> {
            });
        }
    }

    public void testSetError() {
        try {
            test(
                    (a) -> assertCommandOutputStartsWith(a, "/set mode tee -command foo",
                            "|  Does not match any current feedback mode: foo"),
                    (a) -> assertCommandOutputStartsWith(a, "/set mode tee -quiet flurb",
                            "|  Does not match any current feedback mode: flurb"),
                    (a) -> assertCommandOutputStartsWith(a, "/set mode -command tee",
                            "|  Created new feedback mode: tee"),
                    (a) -> assertCommandOutputStartsWith(a, "/set mode verbose -command",
                            "|  Mode to be created already exists: verbose"),
                    (a) -> assertCommandOutputStartsWith(a, "/set mode te -command normal",
                            "|  Created new feedback mode: te"),
                    (a) -> assertCommand(a, "/set format te errorpre 'ERROR: '", ""),
                    (a) -> assertCommandOutputStartsWith(a, "/set feedback te",
                            ""),
                    (a) -> assertCommandOutputStartsWith(a, "/set xyz",
                            "ERROR: Invalid '/set' argument: xyz"),
                    (a) -> assertCommandOutputStartsWith(a, "/set f",
                            "ERROR: Ambiguous sub-command argument to '/set': f"),
                    (a) -> assertCommandOutputStartsWith(a, "/set feedback",
                            "|  /set feedback te"),
                    (a) -> assertCommandOutputStartsWith(a, "/set feedback xyz",
                            "ERROR: Does not match any current feedback mode"),
                    (a) -> assertCommandOutputStartsWith(a, "/set feed",
                            "|  /set feedback te"),
                    (a) -> assertCommandOutputStartsWith(a, "/set format xyz",
                            "ERROR: Does not match any current feedback mode"),
                    (a) -> assertCommandOutputStartsWith(a, "/set format t",
                            "ERROR: Matches more then one current feedback mode: t"),
                    (a) -> assertCommandOutputStartsWith(a, "/set format qqq",
                            "ERROR: Does not match any current feedback mode: qqq"),
                    (a) -> assertCommandOutputStartsWith(a, "/set format te fld",
                            "ERROR: Expected a field name:"),
                    (a) -> assertCommandOutputStartsWith(a, "/set format te fld aaa",
                            "ERROR: Format 'aaa' must be quoted"),
                    (a) -> assertCommandOutputStartsWith(a, "/set format te fld 'aaa' frog",
                            "ERROR: Not a valid selector"),
                    (a) -> assertCommandOutputStartsWith(a, "/set format te fld 'aaa' import-frog",
                            "ERROR: Not a valid selector"),
                    (a) -> assertCommandOutputStartsWith(a, "/set format te fld 'aaa' import-import",
                            "ERROR: Selector kind in multiple sections of"),
                    (a) -> assertCommandOutputStartsWith(a, "/set format te fld 'aaa' import,added",
                            "ERROR: Different selector kinds in same sections of"),
                    (a) -> assertCommandOutputStartsWith(a, "/set trunc te 20x",
                            "ERROR: Truncation length must be an integer: 20x"),
                    (a) -> assertCommandOutputStartsWith(a, "/set trunc qaz",
                            "ERROR: Does not match any current feedback mode: qaz -- /set trunc qaz"),
                    (a) -> assertCommandOutputStartsWith(a, "/set truncation te 111 import,added",
                            "ERROR: Different selector kinds in same sections of"),
                    (a) -> assertCommandOutputContains(a, "/set mode",
                            "|  /set truncation verbose"),
                    (a) -> assertCommandOutputStartsWith(a, "/set mode -command",
                            "ERROR: Missing the feedback mode"),
                    (a) -> assertCommandOutputStartsWith(a, "/set mode x -quiet y",
                            "ERROR: Does not match any current feedback mode"),
                    (a) -> assertCommandOutputStartsWith(a, "/set prompt",
                            "|  /set prompt"),
                    (a) -> assertCommandOutputStartsWith(a, "/set prompt te",
                            "|  /set prompt te "),
                    (a) -> assertCommandOutputStartsWith(a, "/set prompt te aaa xyz",
                            "ERROR: Format 'aaa' must be quoted"),
                    (a) -> assertCommandOutputStartsWith(a, "/set prompt te 'aaa' xyz",
                            "ERROR: Format 'xyz' must be quoted"),
                    (a) -> assertCommandOutputStartsWith(a, "/set prompt te aaa",
                            "ERROR: Format 'aaa' must be quoted"),
                    (a) -> assertCommandOutputStartsWith(a, "/set prompt te 'aaa'",
                            "ERROR: Continuation prompt required"),
                    (a) -> assertCommandOutputStartsWith(a, "/set feedback normal",
                            "|  Feedback mode: normal")
            );
        } finally {
            assertCommandCheckOutput(false, "/set feedback normal", s -> {
            });
        }
    }

    public void testSetHelp() {
        try {
            test(
                    (a) -> assertCommandOutputContains(a, "/help /set", "command to launch"),
                    (a) -> assertCommandOutputContains(a, "/help /set format", "display"),
                    (a) -> assertCommandOutputContains(a, "/hel /se for", "vardecl"),
                    (a) -> assertCommandOutputContains(a, "/help /set editor", "temporary file")
            );
        } finally {
            assertCommandCheckOutput(false, "/set feedback normal", s -> {
            });
        }
    }
}
