/*
 * 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
 * @summary Tests to verify jimage basic options, i.e. --version, -h
 * @library /test/lib
 * @modules jdk.jlink/jdk.tools.jimage
 * @build jdk.test.lib.Asserts
 * @run main JImageBasicsTest
 */

import static jdk.test.lib.Asserts.assertTrue;

public class JImageBasicsTest extends JImageCliTest {

    public void testVersion() {
        jimage("--version")
                .assertSuccess()
                .resultChecker(r -> {
                    assertTrue(r.output.contains(System.getProperty("java.version")), "Contains java version.");
                });
    }

    public void testFullVersion() {
        jimage("--full-version")
                .assertSuccess()
                .resultChecker(r -> {
                    assertTrue(r.output.contains(System.getProperty("java.version")), "Contains java version.");
                });
    }

    public void testHelp() {
        jimage("--help")
                .assertSuccess()
                .resultChecker(r -> verifyHelpOutput(r.output));
    }

    public void testShortHelp() {
        jimage("-h")
                .assertSuccess()
                .resultChecker(r -> verifyHelpOutput(r.output));
    }

    public void testUnknownAction() {
        jimage("unknown")
                .assertFailure()
                .assertShowsError();
    }

    public void testUnknownOption() {
        jimage("--unknown")
                .assertFailure()
                .assertShowsError();
    }

    private void verifyHelpOutput(String output) {
        assertTrue(output.startsWith("Usage: jimage"), "Usage is printed.");
        assertTrue(output.contains("extract"), "Option 'extract' is found.");
        assertTrue(output.contains("info"), "Option 'info' is found.");
        assertTrue(output.contains("list"), "Option 'list' is found.");
        assertTrue(output.contains("verify"), "Option 'verify' is found.");
    }

    public static void main(String[] args) throws Throwable {
        new JImageBasicsTest().runTests();
    }
}

