/*
 *******************************************************************************
 * Copyright (C) 2001-2010, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */

/*
 * New added, 2001-10-17 [Jing/GCL]
 */

package com.ibm.icu.dev.test.format;

import java.text.ParseException;
import java.text.ParsePosition;
import java.util.Date;
import java.util.Locale;

import com.ibm.icu.text.DateFormat;
import com.ibm.icu.text.DateFormatSymbols;
import com.ibm.icu.text.SimpleDateFormat;
import com.ibm.icu.util.Calendar;
import com.ibm.icu.util.TimeZone;

public class DateFormatRegressionTestJ extends com.ibm.icu.dev.test.TestFmwk {
    
    private static final String TIME_STRING = "2000/11/17 08:01:00";
    private static final long UTC_LONG = 974476860000L;
    private static SimpleDateFormat sdf_;
    
    protected void init()throws Exception{
        sdf_ = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        
    }
    public static void main(String[] args) throws Exception {
        new DateFormatRegressionTestJ().run(args);
    }
    
    //Return value of getAmPmStrings
    public void Test4103926() {
        String act_Ampms[];
        String exp_Ampms[]={"AM","PM"};
        Locale.setDefault(Locale.US);
        
        DateFormatSymbols dfs = new DateFormatSymbols();
        act_Ampms = dfs.getAmPmStrings();
        if(act_Ampms.length != exp_Ampms.length) {
            errln("The result is not expected!");
        } else {
            for(int i =0; i<act_Ampms.length; i++) {
                if(!act_Ampms[i].equals(exp_Ampms[i]))
                    errln("The result is not expected!");
            }
        }
    }
    
    //Missing digit in millisecone format in SimpleDateFormat 
    public void Test4148168() {
            Date d = new Date(1002705212906l); 
            String[] ISOPattern = {
                "''yyyy-MM-dd-hh.mm.ss.S''", "''yyyy-MM-dd-hh.mm.ss.SS''", 
                "''yyyy-MM-dd-hh.mm.ss.SSS''", "''yyyy-MM-dd-hh.mm.ss.SSSS''", 
                "''yyyy-MM-dd-hh.mm.ss.SSSSS''", "''yyyy-MM-dd-hh.mm.ss.SSSSSS''", 
                "''yyyy-MM-dd-hh.mm.ss.SSSSSSS''", "''yyyy-MM-dd-hh.mm.ss.SSS000''"};
            SimpleDateFormat aSimpleDF = (SimpleDateFormat)DateFormat.getDateTimeInstance();
    
            for(int i = 0; i<ISOPattern.length; i++) {
                aSimpleDF.applyPattern( ISOPattern[i] );
                logln( "Pattern = " + aSimpleDF.toPattern());
                logln( "Format = " + aSimpleDF.format(d));
            }
    }
    
    //DateFormat getDateTimeInstance(int, int), invalid styles no exception
    public void Test4213086() {
        Date someDate = new Date();
        String d=null;
        try {
            DateFormat df2 = DateFormat.getDateTimeInstance(2, -2);
            d = df2.format(someDate);
            errln("we should catch an exception here");
        } catch(Exception e){
            logln("dateStyle = 2" + "\t timeStyle = -2");
            logln("Exception caught!");
        }            
        
        try {
            DateFormat df3 = DateFormat.getDateTimeInstance(4, 2);
            d = df3.format(someDate);
            errln("we should catch an exception here");
        } catch(Exception e){
            logln("dateStyle = 4" + "\t timeStyle = 2");
            logln("Exception caught!");
            logln("********************************************");
        }
    
        try {
            DateFormat df4 = DateFormat.getDateTimeInstance(-12, -12);
            d = df4.format(someDate);
            errln("we should catch an exception here");
        } catch(Exception e){
            logln("dateStyle = -12" + "\t timeStyle = -12");
            logln("Exception caught!");
            logln("********************************************");
        }
    
        try{
            DateFormat df5 = DateFormat.getDateTimeInstance(2, 123);
            d = df5.format(someDate);    
            errln("we should catch an exception here");
        } catch(Exception e){
            logln("dateStyle = 2" + "\t timeStyle = 123");
            logln("Exception caught!");
            logln("********************************************");
        }
        //read the value in d to get rid of the warning
        if(d!=null){
            logln("The value of d: " + d);
        }
    }
    
    //DateFormat.format works wrongly?
    public void Test4250359() {
        Locale.setDefault(Locale.US);
        Calendar cal = Calendar.getInstance();
        cal.clear();
        cal.set(101 + 1900, 9, 9, 17, 53);
        Date d = cal.getTime();
        DateFormat tf = DateFormat.getTimeInstance(DateFormat.SHORT);
        String act_result = tf.format(d);
        String exp_result = "5:53 PM";
        
        if(!act_result.equals(exp_result)){
            errln("The result is not expected");
        }
    }
    
    //pattern "s.S, parse '1ms'"
    public void Test4253490() {
        Date d = new Date(1002705212231l);
    
        String[] ISOPattern = {
                "''yyyy-MM-dd-hh.mm.ss.S''", 
                "''yyyy-MM-dd-hh.mm.ss.SS''", 
                "''yyyy-MM-dd-hh.mm.ss.SSS''", 
                "''yyyy-MM-dd-hh.mm.ss.SSSS''", 
                "''yyyy-MM-dd-hh.mm.ss.SSSSS''", 
                "''yyyy-MM-dd-hh.mm.ss.SSSSSS''", 
                "''yyyy-MM-dd-hh.mm.ss.SSSSSSS''"}; 
    
        SimpleDateFormat aSimpleDF = (SimpleDateFormat) DateFormat.getDateTimeInstance();
        for (int i = 0; i < ISOPattern.length; i++) {
            aSimpleDF.applyPattern(ISOPattern[i]);
            logln("Pattern = " + aSimpleDF.toPattern());
            logln("Format = " + aSimpleDF.format(d));
        }
    }
    
    //about regression test
    public void Test4266432() {
        Locale.setDefault(Locale.JAPAN);
        Locale loc = Locale.getDefault();
        String dateFormat = "MM/dd/yy HH:mm:ss zzz";
        SimpleDateFormat fmt = new SimpleDateFormat(dateFormat);
    
        ParsePosition p0 = new ParsePosition(0);
        logln("Under  " + loc +"  locale");
        Date d = fmt.parse("01/22/92 04:52:00 GMT", p0);
        logln(d.toString());
    }
    
    //SimpleDateFormat inconsistent for number of digits for years
    public void Test4358730() {
        SimpleDateFormat sdf = new SimpleDateFormat();
        Calendar cal = Calendar.getInstance();
        cal.clear();
        cal.set(2001,11,10);
        Date today = cal.getTime();
    
        sdf.applyPattern("MM d y");
        logln(sdf.format(today));
        sdf.applyPattern("MM d yy");
        logln(sdf.format(today));
    
        sdf.applyPattern("MM d yyy");
        logln(sdf.format(today));
    
        sdf.applyPattern("MM d yyyy");
        logln(sdf.format(today));
    
        sdf.applyPattern("MM d yyyyy");
        logln(sdf.format(today));
    }
    
    //Parse invalid string
    public void Test4375399() {
        final String pattern = new String("yyyy.MM.dd G 'at' hh:mm:ss z");
        SimpleDateFormat sdf = new SimpleDateFormat(pattern, Locale.JAPAN);
        try{
            Date currentTime = sdf.parse("vggf 20  01.0 9.29 ap. J.-C. at 05:26:33 GMT+08:00",
                                new ParsePosition(0));
            if(currentTime ==null)
                logln("parse right");
        } catch(Exception e){
            errln("Error");
        }
    }
    /*
    public void Test4407042() {
        DateParseThread d1 = new DateParseThread();
        DateFormatThread d2 = new DateFormatThread();
        d1.start();
        d2.start();
        try {
            logln("test");
            Thread.sleep(1000);
        } catch (Exception e) {}
    }*/
    
    public void Test4468663() {
        Date d =new Date(-93716671115767l);
        String origin_d = d.toString();
        String str;
        final String pattern = new String("EEEE, MMMM d, yyyy");
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);

        if (sdf.getTimeZone().useDaylightTime()) {
            logln("original date: " + origin_d.toString());
            str = sdf.format(d);
            logln(" after format----->" + str);
            
            d = sdf.parse(str, new ParsePosition(0));
            logln(" after parse----->" + d.toString());
    
            str = sdf.format(d);
            logln(" after format----->" + str);
    
            d = sdf.parse(str, new ParsePosition(0));
            logln(" after parse----->" + d.toString());
    
            str = sdf.format(d);
            logln(" after format----->" + str);        
        }
    }
    
    //Class used by Test4407042
    class DateParseThread extends Thread {
        public void run() {
            SimpleDateFormat sdf = (SimpleDateFormat) sdf_.clone();
            TimeZone defaultTZ = TimeZone.getDefault();
            TimeZone PST = TimeZone.getTimeZone("PST");
            int defaultOffset = defaultTZ.getRawOffset();
            int PSTOffset = PST.getRawOffset();
            int offset = defaultOffset - PSTOffset;
            long ms = UTC_LONG - offset;
            try {
                int i = 0;
                while (i < 10000) {
                    Date date = sdf.parse(TIME_STRING);
                    long t = date.getTime();
                    i++;
                    if (t != ms) {
                        throw new ParseException("Parse Error: " + i + " (" + sdf.format(date) 
                                  + ") " + t + " != " + ms, 0);
                    }
                }
            } catch (Exception e) {
                errln("parse error: " + e.getMessage());
            }
        }
    }
    
    //Class used by Test4407042
    class DateFormatThread extends Thread {
        public void run() {            
            SimpleDateFormat sdf = (SimpleDateFormat) sdf_.clone();
            TimeZone tz = TimeZone.getTimeZone("PST");
            sdf.setTimeZone(tz);
            int i = 0;
            while (i < 10000) {
                i++;
                String s = sdf.format(new Date(UTC_LONG));
                if (!s.equals(TIME_STRING)) {
                    errln("Format Error: " + i + " " + s + " != " 
                                    + TIME_STRING);
                }
            }
        }
    }
    
}
