/**
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.react.tests;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import android.app.DatePickerDialog;
import android.content.DialogInterface;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.widget.DatePicker;
import com.facebook.react.bridge.BaseJavaModule;
import com.facebook.react.testing.ReactInstanceSpecForTest;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.JavaScriptModule;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.WritableNativeMap;
import com.facebook.react.modules.datepicker.DatePickerDialogModule;
import com.facebook.react.testing.ReactAppInstrumentationTestCase;
/**
* Test case for {@link DatePickerDialogModule} options and callbacks.
*/
public class DatePickerDialogTestCase extends ReactAppInstrumentationTestCase {
private static interface DatePickerDialogTestModule extends JavaScriptModule {
public void showDatePickerDialog(WritableMap options);
}
private static class DatePickerDialogRecordingModule extends BaseJavaModule {
private final List<Integer[]> mDates = new ArrayList<Integer[]>();
private int mDismissed = 0;
private int mErrors = 0;
@Override
public String getName() {
return "DatePickerDialogRecordingModule";
}
@ReactMethod
public void recordDate(int year, int month, int day) {
mDates.add(new Integer[] {year, month, day});
}
@ReactMethod
public void recordDismissed() {
mDismissed++;
}
@ReactMethod
public void recordError() {
mErrors++;
}
public List<Integer[]> getDates() {
return new ArrayList<Integer[]>(mDates);
}
public int getDismissed() {
return mDismissed;
}
public int getErrors() {
return mErrors;
}
}
final DatePickerDialogRecordingModule mRecordingModule = new DatePickerDialogRecordingModule();
@Override
protected ReactInstanceSpecForTest createReactInstanceSpecForTest() {
return super.createReactInstanceSpecForTest()
.addNativeModule(mRecordingModule)
.addJSModule(DatePickerDialogTestModule.class);
}
@Override
protected String getReactApplicationKeyUnderTest() {
return "DatePickerDialogTestApp";
}
private static long getDateInMillis(int year, int month, int date) {
final Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DATE, date);
return c.getTimeInMillis();
}
private DatePickerDialogTestModule getTestModule() {
return getReactContext().getCatalystInstance().getJSModule(DatePickerDialogTestModule.class);
}
private DialogFragment showDialog(WritableMap options) {
getTestModule().showDatePickerDialog(options);
waitForBridgeAndUIIdle();
getInstrumentation().waitForIdleSync();
return (DialogFragment) getActivity().getSupportFragmentManager()
.findFragmentByTag(DatePickerDialogModule.FRAGMENT_TAG);
}
public void testShowBasicDatePicker() {
final Fragment datePickerFragment = showDialog(null);
assertNotNull(datePickerFragment);
}
public void testPresetDate() {
final WritableMap options = new WritableNativeMap();
options.putDouble("date", getDateInMillis(2020, 5, 6));
final DialogFragment datePickerFragment = showDialog(options);
final DatePicker datePicker =
((DatePickerDialog) datePickerFragment.getDialog()).getDatePicker();
assertEquals(2020, datePicker.getYear());
assertEquals(5, datePicker.getMonth());
assertEquals(6, datePicker.getDayOfMonth());
}
public void testCallback() throws Throwable {
final WritableMap options = new WritableNativeMap();
options.putDouble("date", getDateInMillis(2020, 5, 6));
final DialogFragment datePickerFragment = showDialog(options);
runTestOnUiThread(
new Runnable() {
@Override
public void run() {
((DatePickerDialog) datePickerFragment.getDialog())
.getButton(DialogInterface.BUTTON_POSITIVE).performClick();
}
});
getInstrumentation().waitForIdleSync();
waitForBridgeAndUIIdle();
assertEquals(0, mRecordingModule.getErrors());
assertEquals(1, mRecordingModule.getDates().size());
assertEquals(2020, (int) mRecordingModule.getDates().get(0)[0]);
assertEquals(5, (int) mRecordingModule.getDates().get(0)[1]);
assertEquals(6, (int) mRecordingModule.getDates().get(0)[2]);
}
public void testDismissCallback() throws Throwable {
final DialogFragment datePickerFragment = showDialog(null);
runTestOnUiThread(
new Runnable() {
@Override
public void run() {
datePickerFragment.getDialog().dismiss();
}
});
getInstrumentation().waitForIdleSync();
waitForBridgeAndUIIdle();
assertEquals(0, mRecordingModule.getErrors());
assertEquals(0, mRecordingModule.getDates().size());
assertEquals(1, mRecordingModule.getDismissed());
}
}