com.facebook.react.tests.DatePickerDialogTestCase.java Source code

Java tutorial

Introduction

Here is the source code for com.facebook.react.tests.DatePickerDialogTestCase.java

Source

/**
 * 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());
    }

}