blob: 8ca1feafd8d21a5dc729d23068e88433fa272645 [file] [log] [blame]
/*
* Copyright (C) 2009 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 android.text.format.cts;
import android.content.ContentResolver;
import android.content.Context;
import android.os.ParcelFileDescriptor;
import android.provider.Settings;
import android.test.InstrumentationTestCase;
import android.text.format.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.Scanner;
import java.util.TimeZone;
public class DateFormatTest extends InstrumentationTestCase {
private Context mContext;
private ContentResolver mContentResolver;
// Date: 2008-12-18 05:30
private static final int YEAR_FROM_1900 = 108;
private static final int YEAR = 2008;
private static final int MONTH = Calendar.DECEMBER; // java.util.Calendar months are 0-based.
private static final int DAY = 18;
private static final int HOUR = 5;
private static final int MINUTE = 30;
private boolean mIs24HourFormat;
private Locale mDefaultLocale;
@Override
protected void setUp() throws Exception {
super.setUp();
enableAppOps();
mContext = getInstrumentation().getContext();
mContentResolver = mContext.getContentResolver();
mIs24HourFormat = DateFormat.is24HourFormat(mContext);
mDefaultLocale = Locale.getDefault();
}
private void enableAppOps() {
StringBuilder cmd = new StringBuilder();
cmd.append("appops set ");
cmd.append(getInstrumentation().getContext().getPackageName());
cmd.append(" android:write_settings allow");
getInstrumentation().getUiAutomation().executeShellCommand(cmd.toString());
StringBuilder query = new StringBuilder();
query.append("appops get ");
query.append(getInstrumentation().getContext().getPackageName());
query.append(" android:write_settings");
String queryStr = query.toString();
String result = "No operations.";
while (result.contains("No operations")) {
ParcelFileDescriptor pfd = getInstrumentation().getUiAutomation().executeShellCommand(
queryStr);
InputStream inputStream = new FileInputStream(pfd.getFileDescriptor());
result = convertStreamToString(inputStream);
}
}
private String convertStreamToString(InputStream is) {
try (Scanner scanner = new Scanner(is).useDelimiter("\\A")) {
return scanner.hasNext() ? scanner.next() : "";
}
}
@Override
protected void tearDown() throws Exception {
if (!mIs24HourFormat) {
Settings.System.putString(mContentResolver, Settings.System.TIME_12_24, "12");
}
if (!Locale.getDefault().equals(mDefaultLocale)) {
Locale.setDefault(mDefaultLocale);
}
super.tearDown();
}
public void test_is24HourFormat() {
Settings.System.putString(mContentResolver, Settings.System.TIME_12_24, "24");
assertTrue(DateFormat.is24HourFormat(mContext));
Settings.System.putString(mContentResolver, Settings.System.TIME_12_24, "12");
assertFalse(DateFormat.is24HourFormat(mContext));
}
public void test_format_M() {
Calendar c = new GregorianCalendar(2008, Calendar.DECEMBER, 18);
assertEquals("D", DateFormat.format("MMMMM", c));
assertEquals("December", DateFormat.format("MMMM", c));
assertEquals("Dec", DateFormat.format("MMM", c));
assertEquals("12", DateFormat.format("MM", c));
assertEquals("12", DateFormat.format("M", c));
}
public void test_format_L() {
// TODO: we can't test other locales with this API so we can't test 'L' properly!
Calendar c = new GregorianCalendar(2008, Calendar.DECEMBER, 18);
assertEquals("D", DateFormat.format("LLLLL", c));
assertEquals("December", DateFormat.format("LLLL", c));
assertEquals("Dec", DateFormat.format("LLL", c));
assertEquals("12", DateFormat.format("LL", c));
assertEquals("12", DateFormat.format("L", c));
}
public void test_format_E() {
Calendar c = new GregorianCalendar(2008, Calendar.DECEMBER, 18);
assertEquals("T", DateFormat.format("EEEEE", c));
assertEquals("Thursday", DateFormat.format("EEEE", c));
assertEquals("Thu", DateFormat.format("EEE", c));
assertEquals("Thu", DateFormat.format("EE", c));
assertEquals("Thu", DateFormat.format("E", c));
}
public void test_format_c() {
// TODO: we can't test other locales with this API, so we can't test 'c' properly!
Calendar c = new GregorianCalendar(2008, Calendar.DECEMBER, 18);
assertEquals("T", DateFormat.format("ccccc", c));
assertEquals("Thursday", DateFormat.format("cccc", c));
assertEquals("Thu", DateFormat.format("ccc", c));
assertEquals("Thu", DateFormat.format("cc", c));
assertEquals("Thu", DateFormat.format("c", c));
}
@SuppressWarnings("deprecation")
public void testFormatMethods() throws ParseException {
if (!mDefaultLocale.equals(Locale.US)) {
Locale.setDefault(Locale.US);
}
java.text.DateFormat dateFormat = DateFormat.getDateFormat(mContext);
assertNotNull(dateFormat);
Date date = new Date(YEAR_FROM_1900, MONTH, DAY, HOUR, MINUTE);
String source = dateFormat.format(date);
Date parseDate = dateFormat.parse(source);
assertEquals(date.getYear(), parseDate.getYear());
assertEquals(date.getMonth(), parseDate.getMonth());
assertEquals(date.getDay(), date.getDay());
dateFormat = DateFormat.getLongDateFormat(mContext);
assertNotNull(dateFormat);
source = dateFormat.format(date);
assertTrue(source.indexOf("December") >= 0);
dateFormat = DateFormat.getMediumDateFormat(mContext);
assertNotNull(dateFormat);
source = dateFormat.format(date);
assertTrue(source.indexOf("Dec") >= 0);
assertTrue(source.indexOf("December") < 0);
dateFormat = DateFormat.getTimeFormat(mContext);
source = dateFormat.format(date);
assertTrue(source.indexOf("5") >= 0);
assertTrue(source.indexOf("30") >= 0);
String format = "MM/dd/yy";
String expectedString = "12/18/08";
Calendar calendar = new GregorianCalendar(YEAR, MONTH, DAY);
CharSequence actual = DateFormat.format(format, calendar);
assertEquals(expectedString, actual.toString());
Date formatDate = new Date(YEAR_FROM_1900, MONTH, DAY);
actual = DateFormat.format(format, formatDate);
assertEquals(expectedString, actual.toString());
actual = DateFormat.format(format, formatDate.getTime());
assertEquals(expectedString, actual.toString());
}
public void test2038() {
Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("GMT+00:00"));
calendar.setTimeInMillis(((long) Integer.MIN_VALUE + Integer.MIN_VALUE) * 1000L);
assertEquals("Sun Nov 24 17:31:44 GMT+00:00 1833",
DateFormat.format("EEE MMM dd HH:mm:ss zzz yyyy", calendar));
calendar.setTimeInMillis(Integer.MIN_VALUE * 1000L);
assertEquals("Fri Dec 13 20:45:52 GMT+00:00 1901",
DateFormat.format("EEE MMM dd HH:mm:ss zzz yyyy", calendar));
calendar.setTimeInMillis(0L);
assertEquals("Thu Jan 01 00:00:00 GMT+00:00 1970",
DateFormat.format("EEE MMM dd HH:mm:ss zzz yyyy", calendar));
calendar.setTimeInMillis(Integer.MAX_VALUE * 1000L);
assertEquals("Tue Jan 19 03:14:07 GMT+00:00 2038",
DateFormat.format("EEE MMM dd HH:mm:ss zzz yyyy", calendar));
calendar.setTimeInMillis((2L + Integer.MAX_VALUE + Integer.MAX_VALUE) * 1000L);
assertEquals("Sun Feb 07 06:28:16 GMT+00:00 2106",
DateFormat.format("EEE MMM dd HH:mm:ss zzz yyyy", calendar));
}
private static void checkFormat(String expected, String pattern, int hour) {
TimeZone utc = TimeZone.getTimeZone("UTC");
Calendar c = new GregorianCalendar(utc);
c.set(2013, Calendar.JANUARY, 1, hour, 00);
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
sdf.setTimeZone(utc);
if (pattern.equals("k") && (hour == 0 || hour == 24)) {
// http://b/8359981: 'k' has always been broken on Android, and we keep it broken
// for compatibility. Maybe one day we'll be able to fix this...
assertEquals("0", DateFormat.format(pattern, c));
} else {
assertEquals(expected, DateFormat.format(pattern, c));
}
assertEquals(expected, sdf.format(c.getTime()));
}
public void test_bug_8359981() {
checkFormat("24", "k", 00);
checkFormat( "0", "K", 00);
checkFormat("12", "h", 00);
checkFormat( "0", "H", 00);
checkFormat( "1", "k", 01);
checkFormat( "1", "K", 01);
checkFormat( "1", "h", 01);
checkFormat( "1", "H", 01);
checkFormat("12", "k", 12);
checkFormat( "0", "K", 12);
checkFormat("12", "h", 12);
checkFormat("12", "H", 12);
checkFormat("13", "k", 13);
checkFormat( "1", "K", 13);
checkFormat( "1", "h", 13);
checkFormat("13", "H", 13);
checkFormat("24", "k", 24);
checkFormat( "0", "K", 24);
checkFormat("12", "h", 24);
checkFormat( "0", "H", 24);
}
}