package com.jakewharton.rxbinding2.support.v4.widget;
import android.app.Instrumentation;
import android.support.test.InstrumentationRegistry;
import android.support.test.espresso.Espresso;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
import android.support.v4.widget.DrawerLayout;
import com.jakewharton.rxbinding.ViewDirtyIdlingResource;
import com.jakewharton.rxbinding2.RecordingObserver;
import com.jakewharton.rxbinding2.UnsafeRunnable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.contrib.DrawerMatchers.isClosed;
import static android.support.test.espresso.contrib.DrawerMatchers.isOpen;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import static android.view.Gravity.RIGHT;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@RunWith(AndroidJUnit4.class)
public final class RxDrawerLayoutTest {
@Rule public final ActivityTestRule<RxDrawerLayoutTestActivity> activityRule =
new ActivityTestRule<>(RxDrawerLayoutTestActivity.class);
private final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
DrawerLayout view;
private ViewDirtyIdlingResource viewDirtyIdler;
@Before public void setUp() {
RxDrawerLayoutTestActivity activity = activityRule.getActivity();
view = activity.drawerLayout;
viewDirtyIdler = new ViewDirtyIdlingResource(activity);
Espresso.registerIdlingResources(viewDirtyIdler);
}
@After public void tearDown() {
Espresso.unregisterIdlingResources(viewDirtyIdler);
}
@Test public void drawerOpen() {
RecordingObserver<Boolean> o = new RecordingObserver<>();
RxDrawerLayout.drawerOpen(view, RIGHT) //
.subscribeOn(AndroidSchedulers.mainThread()) //
.subscribe(o);
assertFalse(o.takeNext());
instrumentation.runOnMainSync(new Runnable() {
@Override public void run() {
view.openDrawer(RIGHT);
}
});
assertTrue(o.takeNext());
instrumentation.runOnMainSync(new Runnable() {
@Override public void run() {
view.closeDrawer(RIGHT);
}
});
assertFalse(o.takeNext());
o.dispose();
instrumentation.runOnMainSync(new Runnable() {
@Override public void run() {
view.openDrawer(RIGHT);
}
});
o.assertNoMoreEvents();
}
@Test public void open() {
final Consumer<? super Boolean> open = RxDrawerLayout.open(view, RIGHT);
instrumentation.runOnMainSync(new UnsafeRunnable() {
@Override protected void unsafeRun() throws Exception {
open.accept(true);
}
});
onView(withId(view.getId())).check(matches(isOpen(RIGHT)));
instrumentation.runOnMainSync(new UnsafeRunnable() {
@Override protected void unsafeRun() throws Exception {
open.accept(false);
}
});
onView(withId(view.getId())).check(matches(isClosed(RIGHT)));
}
}