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 }