mirror of
https://github.com/material-components/material-components-android.git
synced 2026-02-20 08:39:55 +08:00
Resolves https://github.com/material-components/material-components-android/pull/3414 PiperOrigin-RevId: 539713099
189 lines
8.3 KiB
Java
189 lines
8.3 KiB
Java
/*
|
|
* Copyright 2019 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 com.google.android.material.datepicker;
|
|
|
|
import static com.google.android.material.datepicker.MaterialDatePicker.INPUT_MODE_CALENDAR;
|
|
import static com.google.common.truth.Truth.assertThat;
|
|
import static java.util.Calendar.APRIL;
|
|
import static java.util.Calendar.FEBRUARY;
|
|
import static java.util.Calendar.MARCH;
|
|
import static java.util.Calendar.MONDAY;
|
|
import static java.util.Calendar.SUNDAY;
|
|
import static org.junit.Assert.assertEquals;
|
|
|
|
import java.time.Duration;
|
|
import java.util.Calendar;
|
|
import java.util.GregorianCalendar;
|
|
import java.util.TimeZone;
|
|
import org.junit.Test;
|
|
import org.junit.runner.RunWith;
|
|
import org.robolectric.RobolectricTestRunner;
|
|
|
|
/** Test for {@link com.google.android.material.datepicker.MaterialDatePicker}. */
|
|
@RunWith(RobolectricTestRunner.class)
|
|
public class MaterialDatePickerTest {
|
|
|
|
private static final long ONE_DAY_MILLIS = Duration.ofDays(1).toMillis();
|
|
|
|
// Tuesday, December 31, 2019 11:59:00 PM GMT-05:00
|
|
private static final long NEW_YORK_TIME_2019_12_31_11_59_00_PM = 1577854740000L;
|
|
// Tuesday, January 1, 2020 09:00:00 AM UTC+13:00
|
|
private static final long NEW_ZEALAND_TIME_2020_01_11_09_00_00_AM = 1577822400000L;
|
|
private static final TimeZone UTC_TIME_ZONE = TimeZone.getTimeZone("UTC");
|
|
|
|
private static final long FEB_2016 = Month.create(2016, FEBRUARY).timeInMillis;
|
|
private static final long MARCH_2016 = Month.create(2016, MARCH).timeInMillis;
|
|
private static final long APRIL_2016 = Month.create(2016, APRIL).timeInMillis;
|
|
|
|
private static Calendar setTestLocalTime(long testTimeAsEpochMs, TimeZone timeZone) {
|
|
TimeSource fixedTimeSource = TimeSource.fixed(testTimeAsEpochMs, timeZone);
|
|
UtcDates.setTimeSource(fixedTimeSource);
|
|
Calendar testTimeInUtc = fixedTimeSource.now();
|
|
testTimeInUtc.set(Calendar.HOUR_OF_DAY, 0);
|
|
testTimeInUtc.set(Calendar.MINUTE, 0);
|
|
testTimeInUtc.set(Calendar.SECOND, 0);
|
|
testTimeInUtc.set(Calendar.MILLISECOND, 0);
|
|
testTimeInUtc.setTimeZone(UTC_TIME_ZONE);
|
|
|
|
return testTimeInUtc;
|
|
}
|
|
|
|
private static void testTodayInUtcMillisecondsForLocalTime(
|
|
long testTimeAsEpochMs, TimeZone timeZone) {
|
|
Calendar firstMomentOfTodayInUtc = setTestLocalTime(testTimeAsEpochMs, timeZone);
|
|
|
|
long todayUtcMS = MaterialDatePicker.todayInUtcMilliseconds();
|
|
Calendar outputUtcTodayInCalendar = Calendar.getInstance(UTC_TIME_ZONE);
|
|
outputUtcTodayInCalendar.setTimeInMillis(todayUtcMS);
|
|
|
|
// Assert fields finer than a day are stripped.
|
|
assertThat(todayUtcMS % ONE_DAY_MILLIS).isEqualTo(0);
|
|
// Assert date returned by datepicker is same as first moment of today from UTC calender.
|
|
assertThat(outputUtcTodayInCalendar).isEqualTo(firstMomentOfTodayInUtc);
|
|
}
|
|
|
|
private static void testThisMonthInUtcMillisecondsForLocalTime(
|
|
long testTimeAsEpochMs, TimeZone timeZone) {
|
|
Calendar firstMomentOfTodayInUtc = setTestLocalTime(testTimeAsEpochMs, timeZone);
|
|
|
|
long thisMonthUtcMS = MaterialDatePicker.thisMonthInUtcMilliseconds();
|
|
Calendar outputUtcThisMonthInCalendar = Calendar.getInstance(UTC_TIME_ZONE);
|
|
outputUtcThisMonthInCalendar.setTimeInMillis(thisMonthUtcMS);
|
|
|
|
// Assert fields finer than a day are stripped.
|
|
assertThat(thisMonthUtcMS % ONE_DAY_MILLIS).isEqualTo(0);
|
|
// Assert this is the first day of this month in UTC.
|
|
assertThat(outputUtcThisMonthInCalendar.get(Calendar.YEAR))
|
|
.isEqualTo(firstMomentOfTodayInUtc.get(Calendar.YEAR));
|
|
assertThat(outputUtcThisMonthInCalendar.get(Calendar.MONTH))
|
|
.isEqualTo(firstMomentOfTodayInUtc.get(Calendar.MONTH));
|
|
assertThat(outputUtcThisMonthInCalendar.get(Calendar.DATE)).isEqualTo(1);
|
|
}
|
|
|
|
@Test
|
|
public void testSelectionAsOpenAt() {
|
|
MaterialDatePicker.Builder<Long> datePickerBuilder = MaterialDatePicker.Builder.datePicker();
|
|
CalendarConstraints calendarConstraints =
|
|
new CalendarConstraints.Builder().setStart(FEB_2016).setEnd(APRIL_2016).build();
|
|
datePickerBuilder.setCalendarConstraints(calendarConstraints);
|
|
datePickerBuilder.setSelection(APRIL_2016);
|
|
datePickerBuilder.build();
|
|
assertEquals(APRIL_2016, calendarConstraints.getOpenAt().timeInMillis);
|
|
|
|
MaterialDatePicker.Builder<Long> datePickerBuilder2 = MaterialDatePicker.Builder.datePicker();
|
|
CalendarConstraints calendarConstraints2 =
|
|
new CalendarConstraints.Builder().setStart(FEB_2016).setEnd(APRIL_2016).build();
|
|
datePickerBuilder2.setCalendarConstraints(calendarConstraints2);
|
|
datePickerBuilder2.build();
|
|
assertEquals(FEB_2016, calendarConstraints2.getOpenAt().timeInMillis);
|
|
|
|
MaterialDatePicker.Builder<Long> datePickerBuilder3 = MaterialDatePicker.Builder.datePicker();
|
|
CalendarConstraints calendarConstraints3 =
|
|
new CalendarConstraints.Builder()
|
|
.setStart(FEB_2016)
|
|
.setEnd(APRIL_2016)
|
|
.setOpenAt(MARCH_2016)
|
|
.build();
|
|
|
|
datePickerBuilder3.setCalendarConstraints(calendarConstraints3);
|
|
datePickerBuilder3.setSelection(APRIL_2016);
|
|
datePickerBuilder3.build();
|
|
assertEquals(MARCH_2016, calendarConstraints3.getOpenAt().timeInMillis);
|
|
|
|
// A corner case that the selected day is in the same month of the end month.
|
|
MaterialDatePicker.Builder<Long> datePickerBuilder4 = MaterialDatePicker.Builder.datePicker();
|
|
CalendarConstraints calendarConstraints4 =
|
|
new CalendarConstraints.Builder().setStart(FEB_2016).setEnd(APRIL_2016).build();
|
|
datePickerBuilder4.setCalendarConstraints(calendarConstraints4);
|
|
datePickerBuilder4.setSelection(new GregorianCalendar(2016, APRIL, 20).getTimeInMillis());
|
|
datePickerBuilder4.build();
|
|
assertEquals(APRIL_2016, calendarConstraints4.getOpenAt().timeInMillis);
|
|
}
|
|
|
|
@Test
|
|
public void testTodayInUtcMilliseconds() {
|
|
testTodayInUtcMillisecondsForLocalTime(
|
|
NEW_YORK_TIME_2019_12_31_11_59_00_PM, TimeZone.getTimeZone("America/New_York"));
|
|
testTodayInUtcMillisecondsForLocalTime(
|
|
NEW_ZEALAND_TIME_2020_01_11_09_00_00_AM, TimeZone.getTimeZone("NZ"));
|
|
}
|
|
|
|
@Test
|
|
public void testThisMonthInUtcMilliseconds() {
|
|
testThisMonthInUtcMillisecondsForLocalTime(
|
|
NEW_YORK_TIME_2019_12_31_11_59_00_PM, TimeZone.getTimeZone("America/New_York"));
|
|
testThisMonthInUtcMillisecondsForLocalTime(
|
|
NEW_ZEALAND_TIME_2020_01_11_09_00_00_AM, TimeZone.getTimeZone("NZ"));
|
|
}
|
|
|
|
@Test
|
|
public void testFirstDayOfWeekAsSunday() {
|
|
MaterialDatePicker.Builder<Long> datePickerBuilder = MaterialDatePicker.Builder.datePicker();
|
|
CalendarConstraints calendarConstraints =
|
|
new CalendarConstraints.Builder().setFirstDayOfWeek(SUNDAY).build();
|
|
datePickerBuilder.setCalendarConstraints(calendarConstraints);
|
|
datePickerBuilder.build();
|
|
assertEquals(SUNDAY, calendarConstraints.getFirstDayOfWeek());
|
|
}
|
|
|
|
@Test
|
|
public void testFirstDayOfWeekAsMonday() {
|
|
MaterialDatePicker.Builder<Long> datePickerBuilder = MaterialDatePicker.Builder.datePicker();
|
|
CalendarConstraints calendarConstraints =
|
|
new CalendarConstraints.Builder().setFirstDayOfWeek(MONDAY).build();
|
|
datePickerBuilder.setCalendarConstraints(calendarConstraints);
|
|
datePickerBuilder.build();
|
|
assertEquals(MONDAY, calendarConstraints.getFirstDayOfWeek());
|
|
}
|
|
|
|
@Test
|
|
public void testFirstDayOfWeekAsDefault() {
|
|
MaterialDatePicker.Builder<Long> datePickerBuilder = MaterialDatePicker.Builder.datePicker();
|
|
CalendarConstraints calendarConstraints = new CalendarConstraints.Builder().build();
|
|
datePickerBuilder.setCalendarConstraints(calendarConstraints);
|
|
datePickerBuilder.build();
|
|
assertEquals(0, calendarConstraints.getFirstDayOfWeek());
|
|
}
|
|
|
|
@Test
|
|
public void testInputModeCalendarAsDefault() {
|
|
MaterialDatePicker<Long> materialDatePicker = MaterialDatePicker.Builder.datePicker().build();
|
|
|
|
assertEquals(INPUT_MODE_CALENDAR, materialDatePicker.getInputMode());
|
|
}
|
|
}
|