Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/test/java/text/Format/DateFormat/Bug4322313.java
47182 views
/*1* Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223/**24* @test25* @bug 4322313 4833268 6302990 630430526* @library /java/text/testlib27* @summary Make sure that new implementation for28* SimpleDateFormat.parse('z' or 'Z') and format('z' or 'Z') work correctly.29*/3031import java.io.*;32import java.text.*;33import java.util.*;3435public class Bug4322313 extends IntlTest {3637public void Test4322313() {38Locale savedLocale = Locale.getDefault();39TimeZone savedTimeZone = TimeZone.getDefault();40boolean err = false;41long mpm = 60 * 1000; /* Milliseconds per a minute */4243Locale[] locs = {Locale.US, Locale.JAPAN, Locale.UK, new Locale("ar")};4445String[] formats = {46"z",47"Z",48};4950Object[][] valids = {51/* given ID offset format('z'), ('Z') index */52{"GMT+03:04", new Long(-184 * mpm), "GMT+03:04", "+0304", new Integer(9)},53{"GMT+13:42", new Long(-822 * mpm), "GMT+13:42", "+1342", new Integer(9)},54{"GMT+00:00", new Long(0), "GMT+00:00", "+0000", new Integer(9)},55{"GMT+1:11", new Long(-71 * mpm), "GMT+01:11", "+0111", new Integer(8)},56{"GMT +13:42", new Long(0), "GMT", "+0000", new Integer(3)},57{" GMT", new Long(0), "GMT", "+0000", new Integer(4)},58{"+0304", new Long(-184 * mpm), "GMT+03:04", "+0304", new Integer(5)},59{"+1342", new Long(-822 * mpm), "GMT+13:42", "+1342", new Integer(5)},60{"+0000", new Long(0), "GMT+00:00", "+0000", new Integer(5)},61{" +1342", new Long(-822 * mpm), "GMT+13:42", "+1342", new Integer(6)},62/* ISO-LATIN-1 digits */63{"GMT+\u0030\u0031:\u0032\u0033", new Long(-83 * mpm), "GMT+01:23", "+0123", new Integer(9)},6465/* In fact, this test case is skipped because TimeZone class can't66* recognize TimeZone IDs like "+00234" or "-00234".67*/68{"+00234", new Long(-23 * mpm), "GMT+00:23", "+0023", new Integer(5)},6970{"GMT-03:04", new Long(184 * mpm), "GMT-03:04", "-0304", new Integer(9)},71{"GMT-13:42", new Long(822 * mpm), "GMT-13:42", "-1342", new Integer(9)},72{"GMT-00:00", new Long(0), "GMT+00:00", "+0000", new Integer(9)},73{"GMT-1:11", new Long(71 * mpm), "GMT-01:11", "-0111", new Integer(8)},74{"GMT -13:42", new Long(0), "GMT", "+0000", new Integer(3)},75{"-0304", new Long(184 * mpm), "GMT-03:04", "-0304", new Integer(5)},76{"-1342", new Long(822 * mpm), "GMT-13:42", "-1342", new Integer(5)},77{" -1342", new Long(822 * mpm), "GMT-13:42", "-1342", new Integer(6)},78/* ISO-LATIN-1 digits */79{"GMT-\u0030\u0031:\u0032\u0033", new Long(83 * mpm), "GMT-01:23", "-0123", new Integer(9)},80/* In fact, this test case is skipped because TimeZone class can't81* recognize TimeZone IDs like "+00234" or "-00234".82*/83{"-00234", new Long(23 * mpm), "GMT+00:23", "-0023", new Integer(5)},84};8586Object[][] invalids = {87/* given ID error index */88{"GMT+8", new Integer(5)},89{"GMT+18", new Integer(6)},90{"GMT+208", new Integer(6)},91{"GMT+0304", new Integer(6)},92{"GMT+42195", new Integer(5)},93{"GMT+5:8", new Integer(7)},94{"GMT+23:60", new Integer(8)},95{"GMT+11:1", new Integer(8)},96{"GMT+24:13", new Integer(5)},97{"GMT+421:950", new Integer(5)},98{"GMT+0a:0A", new Integer(5)},99{"GMT+ 13:42", new Integer(4)},100{"GMT+13 :42", new Integer(6)},101{"GMT+13: 42", new Integer(7)},102{"GMT+-13:42", new Integer(4)},103{"G M T", new Integer(0)},104{"+8", new Integer(2)},105{"+18", new Integer(3)},106{"+208", new Integer(4)},107{"+2360", new Integer(4)},108{"+2413", new Integer(2)},109{"+42195", new Integer(2)},110{"+0AbC", new Integer(2)},111{"+ 1342", new Integer(1)},112{"+-1342", new Integer(1)},113{"1342", new Integer(0)},114/* Arabic-Indic digits */115{"GMT+\u0660\u0661:\u0662\u0663", new Integer(4)},116/* Extended Arabic-Indic digits */117{"GMT+\u06f0\u06f1:\u06f2\u06f3", new Integer(4)},118/* Devanagari digits */119{"GMT+\u0966\u0967:\u0968\u0969", new Integer(4)},120/* Fullwidth digits */121{"GMT+\uFF10\uFF11:\uFF12\uFF13", new Integer(4)},122123{"GMT-8", new Integer(5)},124{"GMT-18", new Integer(6)},125{"GMT-208", new Integer(6)},126{"GMT-0304", new Integer(6)},127{"GMT-42195", new Integer(5)},128{"GMT-5:8", new Integer(7)},129{"GMT-23:60", new Integer(8)},130{"GMT-11:1", new Integer(8)},131{"GMT-24:13", new Integer(5)},132{"GMT-421:950", new Integer(5)},133{"GMT-0a:0A", new Integer(5)},134{"GMT- 13:42", new Integer(4)},135{"GMT-13 :42", new Integer(6)},136{"GMT-13: 42", new Integer(7)},137{"GMT-+13:42", new Integer(4)},138{"-8", new Integer(2)},139{"-18", new Integer(3)},140{"-208", new Integer(4)},141{"-2360", new Integer(4)},142{"-2413", new Integer(2)},143{"-42195", new Integer(2)},144{"-0AbC", new Integer(2)},145{"- 1342", new Integer(1)},146{"--1342", new Integer(1)},147{"-802", new Integer(2)},148/* Arabic-Indic digits */149{"GMT-\u0660\u0661:\u0662\u0663", new Integer(4)},150/* Extended Arabic-Indic digits */151{"GMT-\u06f0\u06f1:\u06f2\u06f3", new Integer(4)},152/* Devanagari digits */153{"GMT-\u0966\u0967:\u0968\u0969", new Integer(4)},154/* Fullwidth digits */155{"GMT-\uFF10\uFF11:\uFF12\uFF13", new Integer(4)},156};157158try {159for (int i=0; i < locs.length; i++) {160Locale.setDefault(locs[i]);161162for (int j=0; j < formats.length; j++) {163TimeZone.setDefault(TimeZone.getTimeZone("GMT"));164SimpleDateFormat sdf = new SimpleDateFormat(formats[j]);165Date date;166167/* Okay case */168for (int k=0; k < valids.length; k++) {169ParsePosition pos = new ParsePosition(0);170try {171date = sdf.parse((String)valids[k][0], pos);172}173catch (Exception e) {174err = true;175System.err.println("\tParse Error [Locale=" +176Locale.getDefault() + ", " + formats[j] +177"/\"" + valids[k][0] +178"\"] Unexpected Exception occurred: " + e);179continue;180}181182int offset = pos.getIndex();183if (offset != ((Integer)valids[k][4]).intValue()) {184err = true;185System.err.println("\tParse Error [Locale=" +186Locale.getDefault() + ", " + formats[j] +187"/\"" + valids[k][0] +188"\"] invalid index: expected:" + valids[k][4] +189", got:" + offset);190}191192if (date.getTime() != ((Long)valids[k][1]).longValue()) {193err = true;194System.err.println("\tParse Error [Locale=" +195Locale.getDefault() + ", " + formats[j] +196"/\"" + valids[k][0] +197"\"] expected:" + valids[k][1] +198", got:" + date.getTime() + ", " + date);199} else {200/*201logln("\tParse Okay [Locale=" +202Locale.getDefault() + ", " + formats[j] +203"/\"" + valids[k][0] +204"\"] expected:" + valids[k][1] +205", got:" + date.getTime() + ", " + date);206*/207208try {209date = sdf.parse((String)valids[k][0]);210}211catch (Exception e) {212err = true;213System.err.println("\tParse Error [Locale=" +214Locale.getDefault() + ", " + formats[j] +215"/\"" + valids[k][0] +216"\"] Unexpected Exception occurred: " + e);217continue;218}219220/* Since TimeZone.getTimeZone() don't treat221* "+00234" or "-00234" as a valid ID, skips.222*/223if (((String)valids[k][0]).length() == 6) {224continue;225}226227/* Since TimeZone.getTimeZone() don't recognize228* +hhmm/-hhmm format, add "GMT" as prefix.229*/230sdf.setTimeZone(TimeZone.getTimeZone(231(((((String)valids[k][0]).charAt(0) != 'G') ?232"GMT" : "") + valids[k][0])));233StringBuffer s = new StringBuffer();234sdf.format(date, s, new FieldPosition(0));235sdf.setTimeZone(TimeZone.getTimeZone("GMT"));236237String got = s.toString();238String expected = (String)valids[k][2+j];239if (!got.equals(expected) &&240// special case to allow the difference between241// DateFormatSymbols.getZoneStrings() and242// TimeZone.getDisplayName() for "GMT+-00:00"243!(got.equals("GMT-00:00") &&244expected.equals("GMT+00:00"))) {245err = true;246System.err.println("\tFormat Error [Locale=" +247Locale.getDefault() + ", " +248formats[j] + "/\"" + valids[k][0] +249"\"] expected:" + valids[k][2+j] +250", got:" + s + ", " + date);251} else {252/*253logln("\tFormat Okay [Locale=" +254Locale.getDefault() + ", " +255formats[j] + "/\"" + valids[k][0] +256"\"] expected:" + valids[k][2+j] +257", got:" + s + ", " + date);258*/259}260}261}262263/* Error case 1264* using SimpleDateFormat.parse(String, ParsePosition)265*/266for (int k=0; k < invalids.length; k++) {267ParsePosition pos = new ParsePosition(0);268try {269date = sdf.parse((String)invalids[k][0], pos);270if (date != null) {271err = true;272System.err.println("\tParse Error [Locale=" +273Locale.getDefault() + ", " + formats[j] +274"/\"" + invalids[k][0] +275"\"] expected:null , got:" + date);276}277int offset = pos.getErrorIndex();278if (offset != ((Integer)invalids[k][1]).intValue()) {279err = true;280System.err.println("\tParse Error [Locale=" +281Locale.getDefault() + ", " + formats[j] +282"/\"" + invalids[k][0] +283"\"] incorrect offset. expected:" +284invalids[k][1] + ", got: " + offset);285} else {286/*287logln("\tParse Okay [Locale=" +288Locale.getDefault() + ", " + formats[j] +289"/\"" + invalids[k][0] +290"\"] correct offset: " + offset);291*/292}293}294catch (Exception e) {295err = true;296System.err.println("\tParse Error [Locale=" +297Locale.getDefault() + ", " + formats[j] +298"/\"" + invalids[k][0] +299"\"] Unexpected Exception occurred: " + e);300}301}302303/* Error case 2304* using DateFormat.parse(String)305*/306boolean correctParseException = false;307for (int k=0; k < invalids.length; k++) {308try {309date = sdf.parse((String)invalids[k][0]);310}311catch (ParseException e) {312correctParseException = true;313int offset = e.getErrorOffset();314if (offset != ((Integer)invalids[k][1]).intValue()) {315err = true;316System.err.println("\tParse Error [Locale=" +317Locale.getDefault() + ", " + formats[j] +318"/\"" + invalids[k][0] +319"\"] Expected exception occurred with an incorrect offset. expected:" +320invalids[k][1] + ", got: " + offset);321} else {322/*323logln("\tParse Okay [Locale=" +324Locale.getDefault() + ", " + formats[j] +325"/\"" + invalids[k][0] +326"\"] Expected exception occurred with an correct offset: "327+ offset);328*/329}330}331catch (Exception e) {332err = true;333System.err.println("\tParse Error [Locale=" +334Locale.getDefault() + ", " + formats[j] +335"/\"" + invalids[k][0] +336"\"] Invalid exception occurred: " + e);337}338finally {339if (!correctParseException) {340err = true;341System.err.println("\tParse Error: [Locale=" +342Locale.getDefault() + ", " + formats[j] +343"/\"" + invalids[k][0] +344"\"] Expected exception didn't occur.");345}346}347}348}349}350}351finally {352Locale.setDefault(savedLocale);353TimeZone.setDefault(savedTimeZone);354if (err) {355errln("SimpleDateFormat.parse()/format() test failed");356}357}358}359360public static void main(String[] args) throws Exception {361new Bug4322313().run(args);362}363}364365366