/*
 * Copyright (c) 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.
 */

import java.util.Locale;

/*
 * Test application that verifies default locales. Invoked from
 * SystemPropertyTests
 */
public class DefaultLocaleTest {
    public static void main(String... args) {
        String defLoc = Locale.getDefault().toString();
        String defFmtLoc = Locale.getDefault(Locale.Category.FORMAT).toString();
        String defDspLoc = Locale.getDefault(Locale.Category.DISPLAY).toString();

        if (!defLoc.equals(args[0]) ||
            !defFmtLoc.equals(args[1]) ||
            !defDspLoc.equals(args[2])) {
            System.err.println("Some default locale(s) don't match.\n" +
                "Default Locale expected: " + args[0] + ", result: " + defLoc + "\n" +
                "Default Format Locale expected: " + args[1] + ", result: " + defFmtLoc + "\n" +
                "Default Display Locale expected: " + args[2] + ", result: " + defDspLoc);
            System.exit(-1);
        }
    }
}
