blob: 6185f122d8e38d3155734cbd9658881f8385ce8a [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package libcore.java.util;
import java.time.Instant;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import junit.framework.TestCase;
public class DateTest extends TestCase {
// http://code.google.com/p/android/issues/detail?id=6013
public void test_toString_us() throws Exception {
// Ensure that no matter where this is run, we know what time zone to expect.
Locale.setDefault(Locale.US);
TimeZone.setDefault(TimeZone.getTimeZone("America/Chicago"));
assertEquals("Wed Dec 31 18:00:00 CST 1969", new Date(0).toString());
}
// https://code.google.com/p/android/issues/detail?id=81924
public void test_toString_nonUs() {
// The string for the timezone depends on what the default locale is. Not every locale
// has a short-name for America/Chicago -> CST.
Locale.setDefault(Locale.CHINA);
TimeZone.setDefault(TimeZone.getTimeZone("America/Chicago"));
assertEquals("Wed Dec 31 18:00:00 CST 1969", new Date(0).toString());
}
public void test_toGMTString_us() throws Exception {
// Based on https://issues.apache.org/jira/browse/HARMONY-501
TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
Locale.setDefault(Locale.US);
Calendar c = Calendar.getInstance();
c.clear();
c.set(Calendar.YEAR, 21);
assertEquals("Wed Jan 01 00:00:00 PST 21", c.getTime().toString());
assertEquals("1 Jan 21 08:00:00 GMT", c.getTime().toGMTString());
c.set(Calendar.YEAR, 321);
assertEquals("Sun Jan 01 00:00:00 PST 321", c.getTime().toString());
assertEquals("1 Jan 321 08:00:00 GMT", c.getTime().toGMTString());
}
public void test_toGMTString_nonUs() throws Exception {
TimeZone.setDefault(TimeZone.getTimeZone("America/Los_Angeles"));
Locale.setDefault(Locale.UK);
Calendar c = Calendar.getInstance();
c.clear();
c.set(Calendar.YEAR, 21);
assertEquals("Wed Jan 01 00:00:00 PST 21", c.getTime().toString());
assertEquals("1 Jan 21 08:00:00 GMT", c.getTime().toGMTString());
c.set(Calendar.YEAR, 321);
assertEquals("Sun Jan 01 00:00:00 PST 321", c.getTime().toString());
assertEquals("1 Jan 321 08:00:00 GMT", c.getTime().toGMTString());
}
public void test_parse_timezones() {
assertEquals(
Date.parse("Wed, 06 Jan 2016 11:55:59 GMT+05:00"),
Date.parse("Wed, 06 Jan 2016 11:55:59 GMT+0500"));
assertEquals(
Date.parse("Wed, 06 Jan 2016 11:55:59 GMT+05:00"),
Date.parse("Wed, 06 Jan 2016 11:55:59 GMT+05"));
}
/**
* The minimum long value below which {@link Instant#toEpochMilli()} will
* throw is not clearly documented. This test discovers if that minimum
* value ever changes, and also checks that it is also the minimum Instant
* (at a millisecond boundary) that can be converted to a Date.
*/
public void test_convertFromInstant_lowerBound() {
// smallest millisecond Instant that can be converted to Date
long minConvertible = -9223372036854775000L;
// show that this value is < 1 sec away from Long.MIN_VALUE
assertEquals(Long.MIN_VALUE + 808, minConvertible);
Instant inBound = Instant.ofEpochMilli(minConvertible);
assertEquals(new Date(minConvertible), Date.from(inBound));
assertEquals(minConvertible, inBound.toEpochMilli());
Instant outOfBound = Instant.ofEpochMilli(minConvertible - 1);
try {
Date.from(outOfBound);
fail();
} catch (IllegalArgumentException expected) {
assertEquals(ArithmeticException.class, expected.getCause().getClass());
}
try {
outOfBound.toEpochMilli();
fail();
} catch (ArithmeticException expected) {
}
}
public void test_convertFromInstant_upperBound() {
Date.from(Instant.ofEpochMilli(Long.MAX_VALUE));
Date.from(Instant.ofEpochSecond(Long.MAX_VALUE / 1000, 0));
Date.from(Instant.ofEpochSecond(Long.MAX_VALUE / 1000, 999999999));
Instant outOfBound = Instant.ofEpochSecond(Long.MAX_VALUE / 1000 + 1, 0);
try {
Date.from(outOfBound);
fail();
} catch (IllegalArgumentException expected) {
assertEquals(ArithmeticException.class, expected.getCause().getClass());
}
}
/**
* Checks conversion between long, Date and Instant.
*/
public void test_convertToInstantAndBack() {
check_convertToInstantAndBack(0);
check_convertToInstantAndBack(-1);
check_convertToInstantAndBack( 999999999);
check_convertToInstantAndBack(1000000000);
check_convertToInstantAndBack(1000000001);
check_convertToInstantAndBack(1000000002);
check_convertToInstantAndBack(1000000499);
check_convertToInstantAndBack(1000000500);
check_convertToInstantAndBack(1000000999);
check_convertToInstantAndBack(1000001000);
check_convertToInstantAndBack(Long.MIN_VALUE + 808); // minimum ofEpochMilli argument
check_convertToInstantAndBack(Long.MAX_VALUE);
check_convertToInstantAndBack(System.currentTimeMillis());
check_convertToInstantAndBack(Date.parse("Wed, 06 Jan 2016 11:55:59 GMT+0500"));
}
private static void check_convertToInstantAndBack(long millis) {
Date date = new Date(millis);
Instant instant = date.toInstant();
assertEquals(date, Date.from(instant));
assertEquals(instant, Instant.ofEpochMilli(millis));
assertEquals("Millis should be a millions of nanos", 0, instant.getNano() % 1000000);
assertEquals(millis, date.getTime());
assertEquals(millis, instant.toEpochMilli());
}
}