1 /*
  2  * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  */
 23 
 24 /*
 25  * @test
 26  * @bug 4143459
 27  * @summary test Date
 28  * @library /java/text/testlib
 29  */
 30 
 31 import java.text.*;
 32 import java.util.*;
 33 
 34 @SuppressWarnings("deprecation")
 35 public class DateTest extends IntlTest
 36 {
 37     public static void main(String[] args) throws Exception {
 38         new DateTest().run(args);
 39     }
 40 
 41     /**
 42      * @bug 4143459
 43      * Warning: Use TestDefaultZone() for complete testing of this bug.
 44      */
 45     public void TestDefaultZoneLite() {
 46         // Note: This test is redundant with TestDefaultZone().  It was added by
 47         // request to provide a short&sweet test for this bug.  It does not test
 48         // all cases though, so IF THIS TEST PASSES, THE BUG MAY STILL BE
 49         // PRESENT.  Use TestDefaultZone() to be sure.
 50         TimeZone save = TimeZone.getDefault();
 51         try {
 52             TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
 53             Date d = new Date();
 54             d.setYear(98);
 55             d.setMonth(Calendar.JANUARY);
 56             d.setDate(1);
 57             d.setHours(6);
 58             TimeZone.setDefault(TimeZone.getTimeZone("PST"));
 59             if (d.getHours() != 22) {
 60                 errln("Fail: Date.setHours()/getHours() ignoring default zone");
 61             }
 62         }
 63         finally { TimeZone.setDefault(save); }
 64     }
 65 
 66     /**
 67      * @bug 4143459
 68      */
 69     public void TestDefaultZone() {
 70         // Various problems can creep up, with the current implementation of Date,
 71         // when the default zone is changed.
 72 
 73         TimeZone saveZone = TimeZone.getDefault();
 74         try {
 75 
 76             Date d = new Date(); // Trigger static init
 77             Date ref = new Date(883634400000L); // This is Thu Jan 1 1998 6:00 am GMT
 78             String refstr = "Jan 1 1998 6:00";
 79             TimeZone GMT = TimeZone.getTimeZone("GMT");
 80             TimeZone PST = TimeZone.getTimeZone("PST");
 81 
 82             String[] names = { "year", "month", "date", "day of week", "hour", "offset" };
 83             int[] GMT_EXP = { 98, Calendar.JANUARY, 1, Calendar.THURSDAY - Calendar.SUNDAY, 6, 0 };
 84             int[] PST_EXP = { 97, Calendar.DECEMBER, 31, Calendar.WEDNESDAY - Calendar.SUNDAY, 22, 480 };
 85 
 86             // There are two cases to consider: a Date object with no Calendar
 87             // sub-object (most Date objects), and a Date object with a Calendar
 88             // sub-object.  We make two passes to cover the two cases.
 89             for (int pass=0; pass<2; ++pass) {
 90                 logln(pass == 0 ? "Normal Date object" : "Date with Calendar sub-object");
 91 
 92                 TimeZone.setDefault(GMT);
 93                 d = new Date(refstr);
 94                 if (pass == 1) {
 95                     // Force creation of Calendar sub-object
 96                     d.setYear(d.getYear());
 97                 }
 98                 if (d.getTime() != ref.getTime()) {
 99                     errln("FAIL: new Date(\"" + refstr + "\") x GMT -> " + d +
100                           " " + d.getTime() + " ms");
101                 }
102 
103                 int[] fields = { d.getYear(), d.getMonth(), d.getDate(),
104                                  d.getDay(), d.getHours(), d.getTimezoneOffset() };
105                 for (int i=0; i<fields.length; ++i) {
106                     if (fields[i] != GMT_EXP[i]) {
107                         errln("FAIL: GMT Expected " + names[i] + " of " + GMT_EXP[i] +
108                               ", got " + fields[i]);
109                     }
110                 }
111 
112                 TimeZone.setDefault(PST);
113                 int[] fields2 = { d.getYear(), d.getMonth(), d.getDate(),
114                                   d.getDay(), d.getHours(), d.getTimezoneOffset() };
115                 for (int i=0; i<fields2.length; ++i) {
116                     if (fields2[i] != PST_EXP[i]) {
117                         errln("FAIL: PST Expected " + names[i] + " of " + PST_EXP[i] +
118                               ", got " + fields2[i]);
119                     }
120                 }
121             }
122         }
123         finally {
124             TimeZone.setDefault(saveZone);
125         }
126     }
127 
128     // Test the performance of Date
129     public void TestPerformance592()
130     {
131         int REPS = 500;
132 
133         // Do timing test with Date
134         long start = new Date().getTime();
135         for (int i=0; i<REPS; ++i)
136         {
137             Date d = new Date();
138             int y = d.getYear();
139         }
140         long ms = new Date().getTime() - start;
141 
142         double perLoop = ((double)ms) / REPS;
143         logln(REPS + " iterations at " + perLoop + " ms/loop");
144         if (perLoop > PER_LOOP_LIMIT)
145             logln("WARNING: Date constructor/getYear slower than " +
146                   PER_LOOP_LIMIT + " ms");
147     }
148     static double PER_LOOP_LIMIT = 3.0;
149 
150     /**
151      * Verify that the Date(String) constructor works.
152      */
153     public void TestParseOfGMT()
154     {
155         Date OUT = null;
156 
157         /* Input values */
158         String stringVal = "Jan 01 00:00:00 GMT 1900";
159         long expectedVal = -2208988800000L;
160 
161         OUT = new Date( stringVal );
162 
163         if( OUT.getTime( ) == expectedVal ) {
164             // logln("PASS");
165         }
166         else {
167             errln( "Expected: " +
168                    new Date( expectedVal ) +
169                    ": " +
170                    expectedVal +
171                    "  Received: " +
172                    OUT.toString() +
173                    ": " +
174                    OUT.getTime() );
175         }
176     }
177 
178     // Check out Date's behavior with large negative year values; bug 664
179     // As of the fix to bug 4056585, Date should work correctly with
180     // large negative years.
181     public void TestDateNegativeYears()
182     {
183         Date d1= new Date(80,-1,2);
184         logln(d1.toString());
185         d1= new Date(-80,-1,2);
186         logln(d1.toString());
187         boolean e = false;
188         try {
189             d1= new Date(-800000,-1,2);
190             logln(d1.toString());
191         }
192         catch (IllegalArgumentException ex) {
193             e = true;
194         }
195         if (e) errln("FAIL: Saw exception for year -800000");
196         else logln("Pass: No exception for year -800000");
197     }
198 
199     // Verify the behavior of Date
200     public void TestDate480()
201     {
202       TimeZone save = TimeZone.getDefault();
203       try {
204         TimeZone.setDefault(TimeZone.getTimeZone("PST"));
205         Date d1=new java.util.Date(97,8,13,10,8,13);
206         logln("d       = "+d1);
207         Date d2=new java.util.Date(97,8,13,30,8,13); // 20 hours later
208         logln("d+20h   = "+d2);
209 
210         double delta = (d2.getTime() - d1.getTime()) / 3600000;
211 
212         logln("delta   = " + delta + "h");
213 
214         if (delta != 20.0) errln("Expected delta of 20; got " + delta);
215 
216         Calendar cal = Calendar.getInstance();
217         cal.clear();
218         cal.set(1997,8,13,10,8,13);
219         Date t1 = cal.getTime();
220         logln("d       = "+t1);
221         cal.clear();
222         cal.set(1997,8,13,30,8,13); // 20 hours later
223         Date t2 = cal.getTime();
224         logln("d+20h   = "+t2);
225 
226         double delta2 = (t2.getTime() - t1.getTime()) / 3600000;
227 
228         logln("delta   = " + delta2 + "h");
229 
230         if (delta != 20.0) errln("Expected delta of 20; got " + delta2);
231       }
232       finally {
233         TimeZone.setDefault(save);
234       }
235     }
236 }