/*
 * Copyright (c) 2012, 2017, 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 4894330 4810347 6277269 8029388 8169646
 * @compile -XDignore.symbol.file ChangeDataModel.java
 * @run main ChangeDataModel
 * @summary Verify -d32, -d64 and -J prefixed data-model options are rejected on all platforms
 * @author Joseph D. Darcy, ksrini
 */

import java.util.Arrays;

public class ChangeDataModel extends TestHelper {

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

    @Test
    public void check32bitRejection() throws Exception {
        checkRejection("-d32");
    }

    @Test
    public void check64bitRejection() throws Exception {
        checkRejection("-d64");
    }

    void checkRejection(String dmodel) throws Exception {
        String expect = "Unrecognized option: " + dmodel;
        String[] cmds1 = {
            javaCmd,
            dmodel,
            "-version"
        };
        checkRejection(expect, cmds1);

        String[] cmds2 = {
            javacCmd,
            "-J" + dmodel,
            "-version"
        };
        checkRejection(expect, cmds2);
    }


    void checkRejection(String expect, String... cmds) throws Exception {
        TestResult tr = doExec(cmds);
        tr.checkNegative();
        if (!tr.contains(expect)) {
            System.out.println(tr);
            String error = "did not get " + "\'" + expect + "\'" +
                           "with options " + Arrays.asList(cmds);
            throw new Exception(error);
        }
    }
}
