test/jdk/java/util/Locale/bcp47u/FormatTests.java
author naoto
Thu, 11 Jan 2018 12:47:28 -0800
changeset 48455 abd7f09d0a79
parent 48251 57148c79bd75
permissions -rw-r--r--
8194148: bcp47u/SymbolsTests.java and FormatTests.java fail on th_TH locale Reviewed-by: rriggs

/*
 * Copyright (c) 2017, 2018, 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 8176841 8194148
 * @summary Tests *Format class deals with Unicode extensions
 *      correctly.
 * @modules jdk.localedata
 * @run testng/othervm -Djava.locale.providers=CLDR FormatTests
 */

import static org.testng.Assert.assertEquals;

import java.text.DateFormat;
import java.text.NumberFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

/**
 * Test *Format classes with BCP47 U extensions
 */
@Test
public class FormatTests {
    private static TimeZone defaultTZ;

    private static final TimeZone ASIATOKYO = TimeZone.getTimeZone("Asia/Tokyo");
    private static final TimeZone AMLA = TimeZone.getTimeZone("America/Los_Angeles");

    private static final Locale JPTYO = Locale.forLanguageTag("en-u-tz-jptyo");
    private static final Locale JCAL = Locale.forLanguageTag("en-u-ca-japanese");
    private static final Locale USLAX = Locale.forLanguageTag("en-u-tz-uslax");

    private static final Locale RG_GB = Locale.forLanguageTag("en-US-u-rg-gbzzzz");
    private static final Locale RG_DE = Locale.forLanguageTag("en-US-u-rg-dezzzz");

    private static final Locale NU_DEVA = Locale.forLanguageTag("en-US-u-nu-deva");
    private static final Locale NU_SINH = Locale.forLanguageTag("en-US-u-nu-sinh");
    private static final Locale NU_ZZZZ = Locale.forLanguageTag("en-US-u-nu-zzzz");

    private static final double testNum = 12345.6789;
    private static final String NUM_US = "12,345.6789";
    private static final String NUM_DE = "12.345,6789";
    private static final String NUM_DEVA = "\u0967\u0968,\u0969\u096a\u096b.\u096c\u096d\u096e\u096f";
    private static final String NUM_SINH = "\u0de7\u0de8,\u0de9\u0dea\u0deb.\u0dec\u0ded\u0dee\u0def";

    private static final Date testDate = new Calendar.Builder()
                                        .setCalendarType("gregory")
                                        .setDate(2017, 7, 10)
                                        .setTimeOfDay(15, 15, 0)
                                        .setTimeZone(AMLA)
                                        .build()
                                        .getTime();

    @BeforeTest
    public void beforeTest() {
        defaultTZ = TimeZone.getDefault();
        TimeZone.setDefault(AMLA);
    }

    @AfterTest
    public void afterTest() {
        TimeZone.setDefault(defaultTZ);
    }

    @DataProvider(name="dateFormatData")
    Object[][] dateFormatData() {
        return new Object[][] {
            // Locale, Expected calendar, Expected timezone, Expected formatted string

            // -ca
            {JCAL, "java.util.JapaneseImperialCalendar", null,
            "Thursday, August 10, 29 Heisei at 3:15:00 PM Pacific Daylight Time"
            },

            // -tz
            {JPTYO, null, ASIATOKYO,
            "Friday, August 11, 2017 at 7:15:00 AM Japan Standard Time"
            },
            {USLAX, null, AMLA,
            "Thursday, August 10, 2017 at 3:15:00 PM Pacific Daylight Time"
            },

            // -rg
            {RG_GB, null, null,
            "Thursday, 10 August 2017 at 15:15:00 Pacific Daylight Time"
            },
        };
    }

    @DataProvider(name="numberFormatData")
    Object[][] numberFormatData() {
        return new Object[][] {
            // Locale, number, expected format

            // -nu
            {NU_DEVA, testNum, NUM_DEVA},
            {NU_SINH, testNum, NUM_SINH},
            {NU_ZZZZ, testNum, NUM_US},

            // -rg
            {RG_DE, testNum, NUM_DE},

            // -nu & -rg, valid & invalid
            {Locale.forLanguageTag("en-US-u-nu-deva-rg-dezzzz"), testNum, NUM_DEVA},
            {Locale.forLanguageTag("en-US-u-nu-zzzz-rg-dezzzz"), testNum, NUM_US},
            {Locale.forLanguageTag("en-US-u-nu-zzzz-rg-zzzz"), testNum, NUM_US},
        };
    }

    @Test(dataProvider="dateFormatData")
    public void test_DateFormat(Locale locale, String calClass, TimeZone tz,
                                String formatExpected) throws Exception {
        DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locale);
        if (calClass != null) {
            try {
                Class expected = Class.forName(calClass);
            assertEquals(df.getCalendar().getClass(), expected);
            } catch (Exception e) {
                throw e;
            }
        }
        if (tz != null) {
            assertEquals(df.getTimeZone(), tz);
        }
        String formatted = df.format(testDate);
        assertEquals(formatted, formatExpected);
        assertEquals(df.parse(formatted), testDate);
    }

    @Test(dataProvider="numberFormatData")
    public void test_NumberFormat(Locale locale, double num,
                                String formatExpected) throws Exception {
        NumberFormat nf = NumberFormat.getNumberInstance(locale);
        nf.setMaximumFractionDigits(4);
        String formatted = nf.format(num);
        assertEquals(nf.format(num), formatExpected);
        assertEquals(nf.parse(formatted), num);
    }
}