/*
 * Copyright (c) 2007, 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 4052404 4052440 4084688 4092475 4101316 4105828 4107014 4107953 4110613
 * 4118587 4118595 4122371 4126371 4126880 4135316 4135752 4139504 4139940 4143951
 * 4147315 4147317 4147552 4335196 4778440 5010672 6475525 6544471 6627549 6786276
 * @summary test Locales
 */
/*
 *
 *
 * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
 * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved
 *
 * Portions copyright (c) 2007 Sun Microsystems, Inc.
 * All Rights Reserved.
 *
 * The original version of this source code and documentation
 * is copyrighted and owned by Taligent, Inc., a wholly-owned
 * subsidiary of IBM. These materials are provided under terms
 * of a License Agreement between Taligent and Sun. This technology
 * is protected by multiple US and International patents.
 *
 * This notice and attribution to Taligent may not be removed.
 * Taligent is a registered trademark of Taligent, Inc.
 *
 * Permission to use, copy, modify, and distribute this software
 * and its documentation for NON-COMMERCIAL purposes and without
 * fee is hereby granted provided that this copyright notice
 * appears in all copies. Please refer to the file "copyright.html"
 * for further important copyright and licensing information.
 *
 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
 * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
 *
 */

import java.text.*;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.Date;
import java.util.Calendar;
import java.io.*;

public class LocaleTest extends LocaleTestFmwk {
    public LocaleTest() {
    }

    private int ENGLISH = 0;
    private int FRENCH = 1;
    private int CROATIAN = 2;
    private int GREEK = 3;
    private int NORWEGIAN = 4;
    private int ITALIAN = 5;
    private int DUMMY = 6;
    private int MAX_LOCALES = 6;

    private int LANG = 0;
    private int CTRY = 1;
    private int VAR = 2;
    private int NAME = 3;
    private int LANG3 = 4;
    private int CTRY3 = 5;
    private int LCID = 6;
    private int DLANG_EN = 7;
    private int DCTRY_EN = 8;
    private int DVAR_EN = 9;
    private int DNAME_EN = 10;
    private int DLANG_FR = 11;
    private int DCTRY_FR = 12;
    private int DVAR_FR = 13;
    private int DNAME_FR = 14;
    private int DLANG_HR = 15;
    private int DCTRY_HR = 16;
    private int DVAR_HR = 17;
    private int DNAME_HR = 18;
    private int DLANG_EL = 19;
    private int DCTRY_EL = 20;
    private int DVAR_EL = 21;
    private int DNAME_EL = 22;
    private int DLANG_ROOT = 23;
    private int DCTRY_ROOT = 24;
    private int DVAR_ROOT = 25;
    private int DNAME_ROOT = 26;

    private String[][] dataTable = {
        // language code
        {   "en",   "fr",   "hr",   "el",   "no",   "it",   "xx"    },
        // country code
        {   "US",   "FR",   "HR",   "GR",   "NO",   "",   "YY"    },
        // variant code
        {   "",     "",     "",     "",     "NY",   "",   ""    },
        // full name
        {   "en_US",    "fr_FR",    "hr_HR",    "el_GR",    "no_NO_NY", "it",   "xx_YY"  },
        // ISO-3 language
        {   "eng",  "fra",  "hrv",  "ell",  "nor",  "ita",  ""   },
        // ISO-3 country
        {   "USA",  "FRA",  "HRV",  "GRC",  "NOR",  "",     ""   },
        // LCID (not currently public)
        {   "0409", "040c", "041a", "0408", "0814", "",     ""  },

        // display language (English)
        {   "English",  "French",   "Croatian", "Greek",    "Norwegian",    "Italian",  "xx" },
        // display country (English)
        {   "United States",    "France",   "Croatia",  "Greece",   "Norway",   "",     "YY" },
        // display variant (English)
        {   "",     "",     "",     "",     "Nynorsk",   "",     ""},
        // display name (English)
        // Updated no_NO_NY English display name for new pattern-based algorithm
        // (part of Euro support).
        {   "English (United States)", "French (France)", "Croatian (Croatia)", "Greek (Greece)", "Norwegian (Norway,Nynorsk)", "Italian", "xx (YY)" },

        // display langage (French)
        {   "anglais",  "fran\u00e7ais",   "croate", "grec",    "norv\u00e9gien",    "italien", "xx" },
        // display country (French)
        {   "Etats-Unis",    "France",   "Croatie",  "Gr\u00e8ce",   "Norv\u00e8ge", "",     "YY" },
        // display variant (French)
        {   "",     "",     "",     "",     "",     "",    "" },
        // display name (French)
        {   "anglais (Etats-Unis)", "fran\u00e7ais (France)", "croate (Croatie)", "grec (Gr\u00e8ce)", "norv\u00e9gien (Norv\u00e8ge,Nynorsk)", "italien", "xx (YY)" },

        // display langage (Croatian)
        {   "",  "", "hrvatski", "",    "", "", "xx" },
        // display country (Croatian)
        {   "",    "",   "Hrvatska",  "",   "", "", "YY" },
        // display variant (Croatian)
        {   "",     "",     "",     "",     "", "", ""},
        // display name (Croatian)
        {   "", "", "hrvatski (Hrvatska)", "", "", "", "xx (YY)" },

        // display langage (Greek)
        {   "\u0391\u03b3\u03b3\u03bb\u03b9\u03ba\u03ac",  "\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac", "\u039a\u03c1\u03bf\u03b1\u03c4\u03b9\u03ba\u03ac", "\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac",    "\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03b9\u03ba\u03ac", "\u0399\u03c4\u03b1\u03bb\u03b9\u03ba\u03ac", "xx" },
        // display country (Greek)
        {   "\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b5\u03c2 \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03af\u03b5\u03c2",    "\u0393\u03b1\u03bb\u03bb\u03af\u03b1",   "\u039a\u03c1\u03bf\u03b1\u03c4\u03af\u03b1",  "\u0395\u03bb\u03bb\u03ac\u03b4\u03b1",   "\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03af\u03b1", "", "YY" },
        // display variant (Greek)
        {   "",     "",     "",     "",     "", "", "" },
        // display name (Greek)
        {   "\u0391\u03b3\u03b3\u03bb\u03b9\u03ba\u03ac (\u0397\u03bd\u03c9\u03bc\u03ad\u03bd\u03b5\u03c2 \u03a0\u03bf\u03bb\u03b9\u03c4\u03b5\u03af\u03b5\u03c2)", "\u0393\u03b1\u03bb\u03bb\u03b9\u03ba\u03ac (\u0393\u03b1\u03bb\u03bb\u03af\u03b1)", "\u039a\u03c1\u03bf\u03b1\u03c4\u03b9\u03ba\u03ac (\u039a\u03c1\u03bf\u03b1\u03c4\u03af\u03b1)", "\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac (\u0395\u03bb\u03bb\u03ac\u03b4\u03b1)", "\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03b9\u03ba\u03ac (\u039d\u03bf\u03c1\u03b2\u03b7\u03b3\u03af\u03b1,Nynorsk)", "\u0399\u03c4\u03b1\u03bb\u03b9\u03ba\u03ac", "xx (YY)" },

        // display langage (<root>)
        {   "English",  "French",   "Croatian", "Greek",    "Norwegian",  "Italian",  "xx" },
        // display country (<root>)
        {   "United States",    "France",   "Croatia",  "Greece",   "Norway",  "",     "YY" },
        // display variant (<root>)
        {   "",     "",     "",     "",     "Nynorsk",   "",     ""},
        // display name (<root>)
        {   "English (United States)", "French (France)", "Croatian (Croatia)", "Greek (Greece)", "Norwegian (Norway,Nynorsk)", "Italian", "xx (YY)" },
    };

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

    public void TestBasicGetters() {
        for (int i = 0; i <= MAX_LOCALES; i++) {
            Locale testLocale = new Locale(dataTable[LANG][i], dataTable[CTRY][i], dataTable[VAR][i]);
            logln("Testing " + testLocale + "...");

            if (!testLocale.getLanguage().equals(dataTable[LANG][i]))
                errln("  Language code mismatch: " + testLocale.getLanguage() + " versus "
                            + dataTable[LANG][i]);
            if (!testLocale.getCountry().equals(dataTable[CTRY][i]))
                errln("  Country code mismatch: " + testLocale.getCountry() + " versus "
                            + dataTable[CTRY][i]);
            if (!testLocale.getVariant().equals(dataTable[VAR][i]))
                errln("  Variant code mismatch: " + testLocale.getVariant() + " versus "
                            + dataTable[VAR][i]);
            if (!testLocale.toString().equals(dataTable[NAME][i]))
                errln("  Locale name mismatch: " + testLocale.toString() + " versus "
                            + dataTable[NAME][i]);
        }

        logln("Same thing without variant codes...");
        for (int i = 0; i <= MAX_LOCALES; i++) {
            Locale testLocale = new Locale(dataTable[LANG][i], dataTable[CTRY][i]);
            logln("Testing " + testLocale + "...");

            if (!testLocale.getLanguage().equals(dataTable[LANG][i]))
                errln("  Language code mismatch: " + testLocale.getLanguage() + " versus "
                            + dataTable[LANG][i]);
            if (!testLocale.getCountry().equals(dataTable[CTRY][i]))
                errln("  Country code mismatch: " + testLocale.getCountry() + " versus "
                            + dataTable[CTRY][i]);
            if (!testLocale.getVariant().equals(""))
                errln("  Variant code mismatch: " + testLocale.getVariant() + " versus \"\"");
        }
    }

    public void TestSimpleResourceInfo() {
        for (int i = 0; i <= MAX_LOCALES; i++) {
            if (dataTable[LANG][i].equals("xx"))
                continue;

            Locale testLocale = new Locale(dataTable[LANG][i], dataTable[CTRY][i], dataTable[VAR][i]);
            logln("Testing " + testLocale + "...");

            if (!testLocale.getISO3Language().equals(dataTable[LANG3][i]))
                errln("  ISO-3 language code mismatch: " + testLocale.getISO3Language()
                            + " versus " + dataTable[LANG3][i]);
            if (!testLocale.getISO3Country().equals(dataTable[CTRY3][i]))
                errln("  ISO-3 country code mismatch: " + testLocale.getISO3Country()
                            + " versus " + dataTable[CTRY3][i]);
/*
            // getLCID() is currently private
            if (!String.valueOf(testLocale.getLCID()).equals(dataTable[LCID][i]))
                errln("  LCID mismatch: " + testLocale.getLCID() + " versus "
                            + dataTable[LCID][i]);
*/
        }
    }

    /*
     * @bug 4101316
     * @bug 4084688 (This bug appears to be a duplicate of something, because it was fixed
     *              between 1.1.5 and 1.1.6, but I included a new test for it anyway)
     * @bug 4052440 Stop falling back to the default locale.
     */
    public void TestDisplayNames() {
        Locale  saveDefault = Locale.getDefault();
        Locale  english = new Locale("en", "US");
        Locale  french = new Locale("fr", "FR");
        Locale  croatian = new Locale("hr", "HR");
        Locale  greek = new Locale("el", "GR");

        Locale.setDefault(english);
        logln("With default = en_US...");
        logln("  In default locale...");
        doTestDisplayNames(null, DLANG_EN, false);
        logln("  In locale = en_US...");
        doTestDisplayNames(english, DLANG_EN, false);
        logln("  In locale = fr_FR...");
        doTestDisplayNames(french, DLANG_FR, false);
        logln("  In locale = hr_HR...");
        doTestDisplayNames(croatian, DLANG_HR, false);
        logln("  In locale = el_GR...");
        doTestDisplayNames(greek, DLANG_EL, false);

        Locale.setDefault(french);
        logln("With default = fr_FR...");
        logln("  In default locale...");
        doTestDisplayNames(null, DLANG_FR, true);
        logln("  In locale = en_US...");
        doTestDisplayNames(english, DLANG_EN, true);
        logln("  In locale = fr_FR...");
        doTestDisplayNames(french, DLANG_FR, true);
        logln("  In locale = hr_HR...");
        doTestDisplayNames(croatian, DLANG_HR, true);
        logln("  In locale = el_GR...");
        doTestDisplayNames(greek, DLANG_EL, true);

        Locale.setDefault(saveDefault);
    }

    private void doTestDisplayNames(Locale inLocale, int compareIndex, boolean defaultIsFrench) {
        if (defaultIsFrench && !Locale.getDefault().getLanguage().equals("fr"))
            errln("Default locale should be French, but it's really " + Locale.getDefault().getLanguage());
        else if (!defaultIsFrench && !Locale.getDefault().getLanguage().equals("en"))
            errln("Default locale should be English, but it's really " + Locale.getDefault().getLanguage());

        for (int i = 0; i <= MAX_LOCALES; i++) {
            Locale testLocale = new Locale(dataTable[LANG][i], dataTable[CTRY][i], dataTable[VAR][i]);
            logln("  Testing " + testLocale + "...");

            String  testLang;
            String  testCtry;
            String  testVar;
            String  testName;

            if (inLocale == null) {
                testLang = testLocale.getDisplayLanguage();
                testCtry = testLocale.getDisplayCountry();
                testVar = testLocale.getDisplayVariant();
                testName = testLocale.getDisplayName();
            }
            else {
                testLang = testLocale.getDisplayLanguage(inLocale);
                testCtry = testLocale.getDisplayCountry(inLocale);
                testVar = testLocale.getDisplayVariant(inLocale);
                testName = testLocale.getDisplayName(inLocale);
            }

            String  expectedLang;
            String  expectedCtry;
            String  expectedVar;
            String  expectedName;

            expectedLang = dataTable[compareIndex][i];
            if (expectedLang.equals("") && defaultIsFrench)
                expectedLang = dataTable[DLANG_EN][i];
            if (expectedLang.equals(""))
                expectedLang = dataTable[DLANG_ROOT][i];

            expectedCtry = dataTable[compareIndex + 1][i];
            if (expectedCtry.equals("") && defaultIsFrench)
                expectedCtry = dataTable[DCTRY_EN][i];
            if (expectedCtry.equals(""))
                expectedCtry = dataTable[DCTRY_ROOT][i];

            expectedVar = dataTable[compareIndex + 2][i];
            if (expectedVar.equals("") && defaultIsFrench)
                expectedVar = dataTable[DVAR_EN][i];
            if (expectedVar.equals(""))
                expectedVar = dataTable[DVAR_ROOT][i];

            expectedName = dataTable[compareIndex + 3][i];
            if (expectedName.equals("") && defaultIsFrench)
                expectedName = dataTable[DNAME_EN][i];
            if (expectedName.equals(""))
                expectedName = dataTable[DNAME_ROOT][i];

            if (!testLang.equals(expectedLang))
                errln("Display language mismatch: " + testLang + " versus " + expectedLang);
            if (!testCtry.equals(expectedCtry))
                errln("Display country mismatch: " + testCtry + " versus " + expectedCtry);
            if (!testVar.equals(expectedVar))
                errln("Display variant mismatch: " + testVar + " versus " + expectedVar);
            if (!testName.equals(expectedName))
                errln("Display name mismatch: " + testName + " versus " + expectedName);
        }
    }

    public void TestSimpleObjectStuff() {
        Locale  test1 = new Locale("aa", "AA");
        Locale  test2 = new Locale("aa", "AA");
        Locale  test3 = (Locale)test1.clone();
        Locale  test4 = new Locale("zz", "ZZ");

        if (test1 == test2 || test1 == test3 || test1 == test4 || test2 == test3)
            errln("Some of the test variables point to the same locale!");

        if (test3 == null)
            errln("clone() failed to produce a valid object!");

        if (!test1.equals(test2) || !test1.equals(test3) || !test2.equals(test3))
            errln("clone() or equals() failed: objects that should compare equal don't");

        if (test1.equals(test4) || test2.equals(test4) || test3.equals(test4))
            errln("equals() failed: objects that shouldn't compare equal do");

        int hash1 = test1.hashCode();
        int hash2 = test2.hashCode();
        int hash3 = test3.hashCode();

        if (hash1 != hash2 || hash1 != hash3 || hash2 != hash3)
            errln("hashCode() failed: objects that should have the same hash code don't");
    }

    /**
     * @bug 4011756 4011380
     */
    public void TestISO3Fallback() {
        Locale test = new Locale("xx", "YY", "");
        boolean gotException = false;
        String result = "";

        try {
            result = test.getISO3Language();
        }
        catch (MissingResourceException e) {
            gotException = true;
        }
        if (!gotException)
            errln("getISO3Language() on xx_YY returned " + result + " instead of throwing an exception");

        gotException = false;
        try {
            result = test.getISO3Country();
        }
        catch (MissingResourceException e) {
            gotException = true;
        }
        if (!gotException)
            errln("getISO3Country() on xx_YY returned " + result + " instead of throwing an exception");
    }

    /**
     * @bug 4106155 4118587
     */
    public void TestGetLangsAndCountries() {
        // It didn't seem right to just do an exhaustive test of everything here, so I check
        // for the following things:
        // 1) Does each list have the right total number of entries?
        // 2) Does each list contain certain language and country codes we think are important
        //     (the G7 countries, plus a couple others)?
        // 3) Does each list have every entry formatted correctly? (i.e., two characters,
        //     all lower case for the language codes, all upper case for the country codes)
        // 4) Is each list in sorted order?
        String[] test = Locale.getISOLanguages();
        String[] spotCheck1 = { "en", "es", "fr", "de", "it", "ja", "ko", "zh", "th",
                                "he", "id", "iu", "ug", "yi", "za" };

        if (test.length != 188)
            errln("Expected getISOLanguages() to return 188 languages; it returned " + test.length);
        else {
            for (int i = 0; i < spotCheck1.length; i++) {
                int j;
                for (j = 0; j < test.length; j++)
                    if (test[j].equals(spotCheck1[i]))
                        break;
                if (j == test.length || !test[j].equals(spotCheck1[i]))
                    errln("Couldn't find " + spotCheck1[i] + " in language list.");
            }
        }
        for (int i = 0; i < test.length; i++) {
            if (!test[i].equals(test[i].toLowerCase()))
                errln(test[i] + " is not all lower case.");
            if (test[i].length() != 2)
                errln(test[i] + " is not two characters long.");
            if (i > 0 && test[i].compareTo(test[i - 1]) <= 0)
                errln(test[i] + " appears in an out-of-order position in the list.");
        }

        test = Locale.getISOCountries();
        String[] spotCheck2 = { "US", "CA", "GB", "FR", "DE", "IT", "JP", "KR", "CN", "TW", "TH" };


        if (test.length != 246)
            errln("Expected getISOCountries to return 246 countries; it returned " + test.length);
        else {
            for (int i = 0; i < spotCheck2.length; i++) {
                int j;
                for (j = 0; j < test.length; j++)
                    if (test[j].equals(spotCheck2[i]))
                        break;
                if (j == test.length || !test[j].equals(spotCheck2[i]))
                    errln("Couldn't find " + spotCheck2[i] + " in country list.");
            }
        }
        for (int i = 0; i < test.length; i++) {
            if (!test[i].equals(test[i].toUpperCase()))
                errln(test[i] + " is not all upper case.");
            if (test[i].length() != 2)
                errln(test[i] + " is not two characters long.");
            if (i > 0 && test[i].compareTo(test[i - 1]) <= 0)
                errln(test[i] + " appears in an out-of-order position in the list.");
        }
    }

    /**
     * @bug 4126880
     */
    void Test4126880() {
        String[] test;

        test = Locale.getISOCountries();
        test[0] = "SUCKER!!!";
        test = Locale.getISOCountries();
        if (test[0].equals("SUCKER!!!"))
            errln("Changed internal country code list!");

        test = Locale.getISOLanguages();
        test[0] = "HAHAHAHA!!!";
        test = Locale.getISOLanguages();
        if (test[0].equals("HAHAHAHA!!!")) // Fixed typo
            errln("Changes internal language code list!");
    }

    /**
     * @bug 4107014
     */
    public void TestGetAvailableLocales() {
        Locale[] locales = Locale.getAvailableLocales();
        if (locales == null || locales.length == 0)
            errln("Locale.getAvailableLocales() returned no installed locales!");
        else {
            logln("Locale.getAvailableLocales() returned a list of " + locales.length + " locales.");
            for (int i = 0; i < locales.length; i++)
                logln(locales[i].toString());
        }
    }

    /**
     * @bug 4135316
     */
    public void TestBug4135316() {
        Locale[] locales1 = Locale.getAvailableLocales();
        Locale[] locales2 = Locale.getAvailableLocales();
        if (locales1 == locales2)
            errln("Locale.getAvailableLocales() doesn't clone its internal storage!");
    }

    /**
     * @bug 4107953
     */
/*
test commented out pending API-change approval
    public void TestGetLanguagesForCountry() {
        String[] languages = Locale.getLanguagesForCountry("US");

        if (!searchStringArrayFor("en", languages))
            errln("Didn't get en as a language for US");

        languages = Locale.getLanguagesForCountry("FR");
        if (!searchStringArrayFor("fr", languages))
            errln("Didn't get fr as a language for FR");

        languages = Locale.getLanguagesForCountry("CH");
        if (!searchStringArrayFor("fr", languages))
            errln("Didn't get fr as a language for CH");
        if (!searchStringArrayFor("it", languages))
            errln("Didn't get it as a language for CH");
        if (!searchStringArrayFor("de", languages))
            errln("Didn't get de as a language for CH");

        languages = Locale.getLanguagesForCountry("JP");
        if (!searchStringArrayFor("ja", languages))
            errln("Didn't get ja as a language for JP");
    }
*/

    private boolean searchStringArrayFor(String s, String[] array) {
        for (int i = 0; i < array.length; i++)
            if (s.equals(array[i]))
                return true;
        return false;
    }
    /**
     * @bug 4110613
     */
    public void TestSerialization() throws ClassNotFoundException, OptionalDataException,
                    IOException, StreamCorruptedException
    {
        ObjectOutputStream ostream;
        ByteArrayOutputStream obstream;
        byte[] bytes = null;

        obstream = new ByteArrayOutputStream();
        ostream = new ObjectOutputStream(obstream);

        Locale test1 = new Locale("zh", "TW", "");
        int dummy = test1.hashCode();   // fill in the cached hash-code value
        ostream.writeObject(test1);

        bytes = obstream.toByteArray();

        ObjectInputStream istream = new ObjectInputStream(new ByteArrayInputStream(bytes));

        Locale test2 = (Locale)(istream.readObject());

        if (!test1.equals(test2) || test1.hashCode() != test2.hashCode())
            errln("Locale failed to deserialize correctly.");
    }

    /**
     * @bug 4118587
     */
    public void TestSimpleDisplayNames() {
        // This test is different from TestDisplayNames because TestDisplayNames checks
        // fallback behavior, combination of language and country names to form locale
        // names, and other stuff like that.  This test just checks specific language
        // and country codes to make sure we have the correct names for them.
        String[] languageCodes = { "he", "id", "iu", "ug", "yi", "za" };
        String[] languageNames = { "Hebrew", "Indonesian", "Inuktitut", "Uighur", "Yiddish",
                                   "Zhuang" };

        for (int i = 0; i < languageCodes.length; i++) {
            String test = (new Locale(languageCodes[i], "", "")).getDisplayLanguage(Locale.US);
            if (!test.equals(languageNames[i]))
                errln("Got wrong display name for " + languageCodes[i] + ": Expected \"" +
                      languageNames[i] + "\", got \"" + test + "\".");
        }
    }

    /**
     * @bug 4118595
     */
    public void TestUninstalledISO3Names() {
        // This test checks to make sure getISO3Language and getISO3Country work right
        // even for locales that are not installed.
        String[] iso2Languages = { "am", "ba", "fy", "mr", "rn", "ss", "tw", "zu" };
        String[] iso3Languages = { "amh", "bak", "fry", "mar", "run", "ssw", "twi", "zul" };

        for (int i = 0; i < iso2Languages.length; i++) {
            String test = (new Locale(iso2Languages[i], "", "")).getISO3Language();
            if (!test.equals(iso3Languages[i]))
                errln("Got wrong ISO3 code for " + iso2Languages[i] + ": Expected \"" +
                        iso3Languages[i] + "\", got \"" + test + "\".");
        }

        String[] iso2Countries = { "AF", "BW", "KZ", "MO", "MN", "SB", "TC", "ZW" };
        String[] iso3Countries = { "AFG", "BWA", "KAZ", "MAC", "MNG", "SLB", "TCA", "ZWE" };

        for (int i = 0; i < iso2Countries.length; i++) {
            String test = (new Locale("", iso2Countries[i], "")).getISO3Country();
            if (!test.equals(iso3Countries[i]))
                errln("Got wrong ISO3 code for " + iso2Countries[i] + ": Expected \"" +
                        iso3Countries[i] + "\", got \"" + test + "\".");
        }
    }

    /**
     * @bug 4052404 4778440
     */
    public void TestChangedISO639Codes() {
        Locale hebrewOld = new Locale("iw", "IL", "");
        Locale hebrewNew = new Locale("he", "IL", "");
        Locale yiddishOld = new Locale("ji", "IL", "");
        Locale yiddishNew = new Locale("yi", "IL", "");
        Locale indonesianOld = new Locale("in", "", "");
        Locale indonesianNew = new Locale("id", "", "");

        if (!hebrewNew.getLanguage().equals("iw"))
            errln("Got back wrong language code for Hebrew: expected \"iw\", got \"" +
                            hebrewNew.getLanguage() + "\"");
        if (!yiddishNew.getLanguage().equals("ji"))
            errln("Got back wrong language code for Yiddish: expected \"ji\", got \"" +
                            yiddishNew.getLanguage() + "\"");
        if (!indonesianNew.getLanguage().equals("in"))
            errln("Got back wrong language code for Indonesian: expected \"in\", got \"" +
                            indonesianNew.getLanguage() + "\"");
    }

    /**
     * @bug 4092475
     * I could not reproduce this bug.  I'm pretty convinced it was fixed with the
     * big locale-data reorg of 10/28/97.  The lookup logic for language and country
     * display names was also changed at that time in that check-in.    --rtg 3/20/98

     * This test is not designed to work in any other locale but en_US.
     * Most of the LocaleElements do not contain display names for other languages,
     * so this test fails (bug 4289223) when run under different locales. For example,
     * LocaleElements_es as of kestrel does not have a localized name for Japanese, so
     * the getDisplayName method asks the default locale for a display name. The Japanese
     * localized name for "Japanese" does not equal "Japanese" so this test fails for es
     * display names if run under a ja locale. Eventually, he LocaleElements should probably
     * be updated to contain more localized language and region display names.
     * 1999-11-19 joconner
     *
     */
    public void TestAtypicalLocales() {
        Locale[] localesToTest = { new Locale("de", "CA"),
                                   new Locale("ja", "ZA"),
                                   new Locale("ru", "MX"),
                                   new Locale("en", "FR"),
                                   new Locale("es", "DE"),
                                   new Locale("", "HR"),
                                   new Locale("", "SE"),
                                   new Locale("", "DO"),
                                   new Locale("", "BE") };
        String[] englishDisplayNames = { "German (Canada)",
                                         "Japanese (South Africa)",
                                         "Russian (Mexico)",
                                         "English (France)",
                                         "Spanish (Germany)",
                                         "Croatia",
                                         "Sweden",
                                         "Dominican Republic",
                                         "Belgium" };
        String[] frenchDisplayNames = { "allemand (Canada)",
                                        "japonais (Afrique du Sud)",
                                        "russe (Mexique)",
                                         "anglais (France)",
                                         "espagnol (Allemagne)",
                                        "Croatie",
                                        "Su\u00e8de",
                                        "R\u00e9publique Dominicaine",
                                        "Belgique" };
        String[] spanishDisplayNames = { "alem\u00E1n (Canad\u00E1)",
                                         "japon\u00E9s (Sud\u00E1frica)",
                                         "ruso (M\u00e9xico)",
                                         "ingl\u00E9s (Francia)",
                                         "espa\u00f1ol (Alemania)",
                                         "Croacia",
                                         "Suecia",
                                         "Rep\u00fablica Dominicana",
                                         "B\u00E9lgica" };


        // save the default locale and set to the new default to en_US
        Locale defaultLocale = Locale.getDefault();
        Locale.setDefault(Locale.US);

        for (int i = 0; i < localesToTest.length; i++) {
            String name = localesToTest[i].getDisplayName(Locale.US);
            logln(name);
            if (!name.equals(englishDisplayNames[i]))
                errln("Lookup in English failed: expected \"" + englishDisplayNames[i]
                            + "\", got \"" + name + "\"");
        }

        for (int i = 0; i < localesToTest.length; i++) {
            String name = localesToTest[i].getDisplayName(new Locale("es", "ES"));
            logln(name);
            if (!name.equals(spanishDisplayNames[i]))
                errln("Lookup in Spanish failed: expected \"" + spanishDisplayNames[i]
                            + "\", got \"" + name + "\"");
        }

        for (int i = 0; i < localesToTest.length; i++) {
            String name = localesToTest[i].getDisplayName(Locale.FRANCE);
            logln(name);
            if (!name.equals(frenchDisplayNames[i]))
                errln("Lookup in French failed: expected \"" + frenchDisplayNames[i]
                            + "\", got \"" + name + "\"");
        }

        // restore the default locale for other tests
        Locale.setDefault(defaultLocale);
    }

    /**
     * @bug 4126371
     */
    public void TestNullDefault() {
        // why on earth anyone would ever try to do this is beyond me, but we should
        // definitely make sure we don't let them
        boolean gotException = false;
        try {
            Locale.setDefault(null);
        }
        catch (NullPointerException e) {
            // all other exception types propagate through here back to the test harness
            gotException = true;
        }
        if (Locale.getDefault() == null)
            errln("Locale.getDefault() allowed us to set default to NULL!");
        if (!gotException)
            errln("Trying to set default locale to NULL didn't throw exception!");
    }

    /**
     * @bug 4135752
     * This would be better tested by the LocaleDataTest.  Will move it when I
     * get the LocaleDataTest working again.
     */
    public void TestThaiCurrencyFormat() {
        DecimalFormat thaiCurrency = (DecimalFormat)NumberFormat.getCurrencyInstance(
                        new Locale("th", "TH"));
        if (!thaiCurrency.getPositivePrefix().equals("\u0e3f"))
            errln("Thai currency prefix wrong: expected \"\u0e3f\", got \"" +
                            thaiCurrency.getPositivePrefix() + "\"");
        if (!thaiCurrency.getPositiveSuffix().equals(""))
            errln("Thai currency suffix wrong: expected \"\", got \"" +
                            thaiCurrency.getPositiveSuffix() + "\"");
    }

    /**
     * @bug 4122371
     * Confirm that Euro support works.  This test is pretty rudimentary; all it does
     * is check that any locales with the EURO variant format a number using the
     * Euro currency symbol.
     *
     * ASSUME: All locales encode the Euro character "\u20AC".
     * If this is changed to use the single-character Euro symbol, this
     * test must be updated.
     *
     * DON'T ASSUME: Any specific countries support the Euro.  Instead,
     * iterate through all locales.
     */
    public void TestEuroSupport() {
        final String EURO_VARIANT  = "EURO";
        final String EURO_CURRENCY = "\u20AC"; // Look for this string in formatted Euro currency

        Locale[] locales = NumberFormat.getAvailableLocales();
        for (int i=0; i<locales.length; ++i) {
            Locale loc = locales[i];
            if (loc.getVariant().indexOf(EURO_VARIANT) >= 0) {
                NumberFormat nf = NumberFormat.getCurrencyInstance(loc);
                String pos = nf.format(271828.182845);
                String neg = nf.format(-271828.182845);
                if (pos.indexOf(EURO_CURRENCY) >= 0 &&
                    neg.indexOf(EURO_CURRENCY) >= 0) {
                    logln("Ok: " + loc.toString() +
                          ": " + pos + " / " + neg);
                }
                else {
                    errln("Fail: " + loc.toString() +
                          " formats without " + EURO_CURRENCY +
                          ": " + pos + " / " + neg +
                          "\n*** THIS FAILURE MAY ONLY MEAN THAT LOCALE DATA HAS CHANGED ***");
                }
            }
        }
    }

    /**
     * @bug 4139504
     * toString() doesn't work with language_VARIANT.
     */
    public void TestToString() {
        Object[] DATA = {
            new Locale("xx", "", ""), "xx",
            new Locale("", "YY", ""), "_YY",
        new Locale("", "", "ZZ"), "",
            new Locale("xx", "YY", ""), "xx_YY",
            new Locale("xx", "", "ZZ"), "xx__ZZ",
            new Locale("", "YY", "ZZ"), "_YY_ZZ",
            new Locale("xx", "YY", "ZZ"), "xx_YY_ZZ",
        };
        for (int i=0; i<DATA.length; i+=2) {
            Locale loc = (Locale)DATA[i];
            String fmt = (String)DATA[i+1];
            if (!loc.toString().equals(fmt)) {
                errln("Fail: Locale.toString(" + fmt + ")=>" + loc);
            }
        }
    }

    /**
     * @bug 4105828
     * Currency symbol in zh is wrong.  We will test this at the NumberFormat
     * end to test the whole pipe.
     */
    public void Test4105828() {
        Locale[] LOC = { Locale.CHINESE, new Locale("zh", "CN", ""),
                         new Locale("zh", "TW", ""), new Locale("zh", "HK", "") };
        for (int i=0; i<LOC.length; ++i) {
            NumberFormat fmt = NumberFormat.getPercentInstance(LOC[i]);
            String result = fmt.format(1);
            if (!result.equals("100%")) {
                errln("Percent for " + LOC[i] + " should be 100%, got " + result);
            }
        }
    }

    /**
     * @bug 4139940
     * Couldn't reproduce this bug -- probably was fixed earlier.
     *
     * ORIGINAL BUG REPORT:
     * -- basically, hungarian for monday shouldn't have an \u00f4
     * (o circumflex)in it instead it should be an o with 2 inclined
     * (right) lines over it..
     *
     * You may wonder -- why do all this -- why not just add a line to
     * LocaleData?  Well, I could see by inspection that the locale file had the
     * right character in it, so I wanted to check the rest of the pipeline -- a
     * very remote possibility, but I wanted to be sure.  The other possibility
     * is that something is wrong with the font mapping subsystem, but we can't
     * test that here.
     */
    public void Test4139940() {
        Locale mylocale=new Locale("hu", "", "");
        Date mydate = new Date(98,3,13); // A Monday
        DateFormat df_full = new SimpleDateFormat("EEEE", mylocale);
        String str = df_full.format(mydate);
        // Make sure that o circumflex (\u00F4) is NOT there, and
        // o double acute (\u0151) IS.
        if (str.indexOf('\u0151') < 0 || str.indexOf('\u00F4') >= 0)
            errln("Fail: Monday in Hungarian is wrong");
    }

    /**
     * @bug 4143951
     * Russian first day of week should be Monday. Confirmed.
     */
    public void Test4143951() {
        Calendar cal = Calendar.getInstance(new Locale("ru", "", ""));
        if (cal.getFirstDayOfWeek() != Calendar.MONDAY) {
            errln("Fail: First day of week in Russia should be Monday");
        }
    }

    /**
     * @bug 4147315
     * java.util.Locale.getISO3Country() works wrong for non ISO-3166 codes.
     * Should throw an exception for unknown locales
     */
    public void Test4147315() {
        // Try with codes that are the wrong length but happen to match text
        // at a valid offset in the mapping table
        Locale locale = new Locale("aaa", "CCC");

        try {
            String result = locale.getISO3Country();

            errln("ERROR: getISO3Country() returns: " + result +
                " for locale '" + locale + "' rather than exception" );
        } catch(MissingResourceException e) { }
    }

    /**
     * @bug 4147317
     * java.util.Locale.getISO3Language() works wrong for non ISO-3166 codes.
     * Should throw an exception for unknown locales
     */
    public void Test4147317() {
        // Try with codes that are the wrong length but happen to match text
        // at a valid offset in the mapping table
        Locale locale = new Locale("aaa", "CCC");

        try {
            String result = locale.getISO3Language();

            errln("ERROR: getISO3Language() returns: " + result +
                " for locale '" + locale + "' rather than exception" );
        } catch(MissingResourceException e) { }
    }

    /*
     * @bug 4147552 4778440
     */
    public void Test4147552() {
        Locale[] locales = { new Locale("no", "NO"), new Locale("no", "NO", "B"),
                             new Locale("no", "NO", "NY") };
        String[] englishDisplayNames = { "Norwegian (Norway)",
                     "Norwegian (Norway,Bokm\u00e5l)",
                     "Norwegian (Norway,Nynorsk)" };
        String[] norwegianDisplayNames = { "norsk (Norge)",
                     "norsk (Norge,bokm\u00e5l)", "norsk (Norge,nynorsk)" };

        for (int i = 0; i < locales.length; i++) {
            Locale loc = locales[i];
            if (!loc.getDisplayName(Locale.US).equals(englishDisplayNames[i]))
               errln("English display-name mismatch: expected " +
                       englishDisplayNames[i] + ", got " + loc.getDisplayName());
            if (!loc.getDisplayName(loc).equals(norwegianDisplayNames[i]))
                errln("Norwegian display-name mismatch: expected " +
                       norwegianDisplayNames[i] + ", got " +
                       loc.getDisplayName(loc));
        }
    }

    static String escapeUnicode(String s) {
        StringBuffer buf = new StringBuffer();
        for (int i=0; i<s.length(); ++i) {
            char c = s.charAt(i);
            if (c >= 0x20 && c <= 0x7F) buf.append(c);
            else {
                buf.append("\\u");
                String h = "000" + Integer.toHexString(c);
                if (h.length() > 4) h = h.substring(h.length() - 4);
                buf.append(h);
            }
        }
        return buf.toString();
    }
}
