Merge "Fix flaky tests in Transition" into androidx-master-dev
diff --git a/transition/src/androidTest/java/androidx/transition/ChangeClipBoundsTest.java b/transition/src/androidTest/java/androidx/transition/ChangeClipBoundsTest.java
index 87b48c0..bd4f8d1 100644
--- a/transition/src/androidTest/java/androidx/transition/ChangeClipBoundsTest.java
+++ b/transition/src/androidTest/java/androidx/transition/ChangeClipBoundsTest.java
@@ -19,17 +19,22 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
+import android.graphics.Color;
import android.graphics.Rect;
import android.view.View;
import androidx.core.view.ViewCompat;
import androidx.test.filters.MediumTest;
import androidx.test.filters.SdkSuppress;
-import androidx.transition.test.R;
import org.junit.Test;
+import org.mockito.ArgumentMatcher;
@MediumTest
public class ChangeClipBoundsTest extends BaseTransitionTest {
@@ -42,11 +47,16 @@
@SdkSuppress(minSdkVersion = 18)
@Test
public void testChangeClipBounds() throws Throwable {
- enterScene(R.layout.scene1);
+ final View redSquare = spy(new View(rule.getActivity()));
+ rule.runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ redSquare.setBackgroundColor(Color.RED);
+ mRoot.addView(redSquare, 100, 100);
+ }
+ });
- final View redSquare = rule.getActivity().findViewById(R.id.redSquare);
- final Rect newClip = new Rect(redSquare.getLeft() + 10, redSquare.getTop() + 10,
- redSquare.getRight() - 10, redSquare.getBottom() - 10);
+ final Rect newClip = new Rect(40, 40, 60, 60);
rule.runOnUiThread(new Runnable() {
@Override
@@ -57,19 +67,8 @@
}
});
waitForStart();
- Thread.sleep(150);
- rule.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- Rect midClip = ViewCompat.getClipBounds(redSquare);
- assertNotNull(midClip);
- assertTrue(midClip.left > 0 && midClip.left < newClip.left);
- assertTrue(midClip.top > 0 && midClip.top < newClip.top);
- assertTrue(midClip.right < redSquare.getRight() && midClip.right > newClip.right);
- assertTrue(midClip.bottom < redSquare.getBottom()
- && midClip.bottom > newClip.bottom);
- }
- });
+ verify(redSquare, timeout(1000).atLeastOnce())
+ .setClipBounds(argThat(isRectContaining(newClip)));
waitForEnd();
rule.runOnUiThread(new Runnable() {
@@ -82,6 +81,7 @@
});
resetListener();
+ reset(redSquare);
rule.runOnUiThread(new Runnable() {
@Override
public void run() {
@@ -90,19 +90,8 @@
}
});
waitForStart();
- Thread.sleep(150);
- rule.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- Rect midClip = ViewCompat.getClipBounds(redSquare);
- assertNotNull(midClip);
- assertTrue(midClip.left > 0 && midClip.left < newClip.left);
- assertTrue(midClip.top > 0 && midClip.top < newClip.top);
- assertTrue(midClip.right < redSquare.getRight() && midClip.right > newClip.right);
- assertTrue(midClip.bottom < redSquare.getBottom()
- && midClip.bottom > newClip.bottom);
- }
- });
+ verify(redSquare, timeout(1000).atLeastOnce())
+ .setClipBounds(argThat(isRectContainedIn(newClip)));
waitForEnd();
rule.runOnUiThread(new Runnable() {
@@ -114,6 +103,24 @@
}
+ private ArgumentMatcher<Rect> isRectContaining(final Rect rect) {
+ return new ArgumentMatcher<Rect>() {
+ @Override
+ public boolean matches(Rect self) {
+ return rect != null && self != null && self.contains(rect);
+ }
+ };
+ }
+
+ private ArgumentMatcher<Rect> isRectContainedIn(final Rect rect) {
+ return new ArgumentMatcher<Rect>() {
+ @Override
+ public boolean matches(Rect self) {
+ return rect != null && self != null && rect.contains(self);
+ }
+ };
+ }
+
@Test
public void dummy() {
// Avoid "No tests found" on older devices
diff --git a/transition/src/androidTest/java/androidx/transition/ChangeScrollTest.java b/transition/src/androidTest/java/androidx/transition/ChangeScrollTest.java
index 23420de..af0c6e0 100644
--- a/transition/src/androidTest/java/androidx/transition/ChangeScrollTest.java
+++ b/transition/src/androidTest/java/androidx/transition/ChangeScrollTest.java
@@ -16,15 +16,17 @@
package androidx.transition;
-import static org.hamcrest.CoreMatchers.both;
-import static org.hamcrest.Matchers.greaterThan;
-import static org.hamcrest.Matchers.lessThan;
-import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
+import static org.mockito.AdditionalMatchers.and;
+import static org.mockito.AdditionalMatchers.gt;
+import static org.mockito.AdditionalMatchers.lt;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
-import android.view.View;
+import android.widget.TextView;
+import androidx.test.InstrumentationRegistry;
import androidx.test.filters.MediumTest;
import androidx.transition.test.R;
@@ -40,11 +42,18 @@
@Test
public void testChangeScroll() throws Throwable {
- enterScene(R.layout.scene5);
+ final TextView view = spy(new TextView(rule.getActivity()));
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ mRoot.addView(view, 100, 100);
+ view.setText(R.string.longText);
+ }
+ });
+
rule.runOnUiThread(new Runnable() {
@Override
public void run() {
- final View view = rule.getActivity().findViewById(R.id.text);
assertEquals(0, view.getScrollX());
assertEquals(0, view.getScrollY());
TransitionManager.beginDelayedTransition(mRoot, mTransition);
@@ -52,22 +61,14 @@
}
});
waitForStart();
- Thread.sleep(150);
- rule.runOnUiThread(new Runnable() {
- @Override
- public void run() {
- final View view = rule.getActivity().findViewById(R.id.text);
- final int scrollX = view.getScrollX();
- final int scrollY = view.getScrollY();
- assertThat(scrollX, is(both(greaterThan(0)).and(lessThan(150))));
- assertThat(scrollY, is(both(greaterThan(0)).and(lessThan(300))));
- }
- });
+
+ verify(view, timeout(1000).atLeastOnce()).setScrollX(and(gt(0), lt(150)));
+ verify(view, timeout(1000).atLeastOnce()).setScrollY(and(gt(0), lt(300)));
+
waitForEnd();
rule.runOnUiThread(new Runnable() {
@Override
public void run() {
- final View view = rule.getActivity().findViewById(R.id.text);
assertEquals(150, view.getScrollX());
assertEquals(300, view.getScrollY());
}
diff --git a/transition/src/androidTest/java/androidx/transition/ExplodeTest.java b/transition/src/androidTest/java/androidx/transition/ExplodeTest.java
index 6e93290..03f098f 100644
--- a/transition/src/androidTest/java/androidx/transition/ExplodeTest.java
+++ b/transition/src/androidTest/java/androidx/transition/ExplodeTest.java
@@ -16,93 +16,112 @@
package androidx.transition;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.Matchers.greaterThan;
-import static org.hamcrest.Matchers.lessThan;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.never;
+import static org.mockito.AdditionalMatchers.and;
+import static org.mockito.AdditionalMatchers.gt;
+import static org.mockito.AdditionalMatchers.lt;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
-import android.os.SystemClock;
+import android.graphics.Color;
+import android.view.Gravity;
import android.view.View;
+import android.widget.FrameLayout;
+import android.widget.LinearLayout;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.MediumTest;
-import androidx.transition.test.R;
+import org.junit.Before;
import org.junit.Test;
+import org.mockito.verification.VerificationMode;
@MediumTest
public class ExplodeTest extends BaseTransitionTest {
+ private View mRedSquare;
+ private View mGreenSquare;
+ private View mBlueSquare;
+ private View mYellowSquare;
+
@Override
Transition createTransition() {
return new Explode();
}
+ @Before
+ public void prepareViews() {
+ mRedSquare = spy(new View(rule.getActivity()));
+ mGreenSquare = spy(new View(rule.getActivity()));
+ mBlueSquare = spy(new View(rule.getActivity()));
+ mYellowSquare = spy(new View(rule.getActivity()));
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
+ @Override
+ public void run() {
+ final FrameLayout frame = new FrameLayout(rule.getActivity());
+ mRedSquare.setBackgroundColor(Color.RED);
+ frame.addView(mRedSquare,
+ new FrameLayout.LayoutParams(100, 100, Gravity.LEFT | Gravity.TOP));
+ mGreenSquare.setBackgroundColor(Color.GREEN);
+ frame.addView(mGreenSquare,
+ new FrameLayout.LayoutParams(100, 100, Gravity.RIGHT | Gravity.TOP));
+ mBlueSquare.setBackgroundColor(Color.BLUE);
+ frame.addView(mBlueSquare,
+ new FrameLayout.LayoutParams(100, 100, Gravity.RIGHT | Gravity.BOTTOM));
+ mYellowSquare.setBackgroundColor(Color.YELLOW);
+ frame.addView(mYellowSquare,
+ new FrameLayout.LayoutParams(100, 100, Gravity.LEFT | Gravity.BOTTOM));
+ mRoot.addView(frame,
+ LinearLayout.LayoutParams.MATCH_PARENT,
+ LinearLayout.LayoutParams.MATCH_PARENT);
+ }
+ });
+ }
+
@Test
public void testExplode() throws Throwable {
- enterScene(R.layout.scene10);
- final View redSquare = rule.getActivity().findViewById(R.id.redSquare);
- final View greenSquare = rule.getActivity().findViewById(R.id.greenSquare);
- final View blueSquare = rule.getActivity().findViewById(R.id.blueSquare);
- final View yellowSquare = rule.getActivity().findViewById(R.id.yellowSquare);
-
rule.runOnUiThread(new Runnable() {
@Override
public void run() {
TransitionManager.beginDelayedTransition(mRoot, mTransition);
- redSquare.setVisibility(View.INVISIBLE);
- greenSquare.setVisibility(View.INVISIBLE);
- blueSquare.setVisibility(View.INVISIBLE);
- yellowSquare.setVisibility(View.INVISIBLE);
+ mRedSquare.setVisibility(View.INVISIBLE);
+ mGreenSquare.setVisibility(View.INVISIBLE);
+ mBlueSquare.setVisibility(View.INVISIBLE);
+ mYellowSquare.setVisibility(View.INVISIBLE);
}
});
waitForStart();
- verify(mListener, never()).onTransitionEnd(any(Transition.class));
- assertEquals(View.VISIBLE, redSquare.getVisibility());
- assertEquals(View.VISIBLE, greenSquare.getVisibility());
- assertEquals(View.VISIBLE, blueSquare.getVisibility());
- assertEquals(View.VISIBLE, yellowSquare.getVisibility());
- float redStartX = redSquare.getTranslationX();
- float redStartY = redSquare.getTranslationY();
+ assertEquals(View.VISIBLE, mRedSquare.getVisibility());
+ assertEquals(View.VISIBLE, mGreenSquare.getVisibility());
+ assertEquals(View.VISIBLE, mBlueSquare.getVisibility());
+ assertEquals(View.VISIBLE, mYellowSquare.getVisibility());
- SystemClock.sleep(100);
- verifyTranslation(redSquare, true, true);
- verifyTranslation(greenSquare, false, true);
- verifyTranslation(blueSquare, false, false);
- verifyTranslation(yellowSquare, true, false);
- assertThat(redStartX, is(greaterThan(redSquare.getTranslationX()))); // moving left
- assertThat(redStartY, is(greaterThan(redSquare.getTranslationY()))); // moving up
+ verifyMovement(mRedSquare, Gravity.LEFT | Gravity.TOP, true);
+ verifyMovement(mGreenSquare, Gravity.RIGHT | Gravity.TOP, true);
+ verifyMovement(mBlueSquare, Gravity.RIGHT | Gravity.BOTTOM, true);
+ verifyMovement(mYellowSquare, Gravity.LEFT | Gravity.BOTTOM, true);
waitForEnd();
- verifyNoTranslation(redSquare);
- verifyNoTranslation(greenSquare);
- verifyNoTranslation(blueSquare);
- verifyNoTranslation(yellowSquare);
- assertEquals(View.INVISIBLE, redSquare.getVisibility());
- assertEquals(View.INVISIBLE, greenSquare.getVisibility());
- assertEquals(View.INVISIBLE, blueSquare.getVisibility());
- assertEquals(View.INVISIBLE, yellowSquare.getVisibility());
+ verifyNoTranslation(mRedSquare);
+ verifyNoTranslation(mGreenSquare);
+ verifyNoTranslation(mBlueSquare);
+ verifyNoTranslation(mYellowSquare);
+ assertEquals(View.INVISIBLE, mRedSquare.getVisibility());
+ assertEquals(View.INVISIBLE, mGreenSquare.getVisibility());
+ assertEquals(View.INVISIBLE, mBlueSquare.getVisibility());
+ assertEquals(View.INVISIBLE, mYellowSquare.getVisibility());
}
@Test
public void testImplode() throws Throwable {
- enterScene(R.layout.scene10);
- final View redSquare = rule.getActivity().findViewById(R.id.redSquare);
- final View greenSquare = rule.getActivity().findViewById(R.id.greenSquare);
- final View blueSquare = rule.getActivity().findViewById(R.id.blueSquare);
- final View yellowSquare = rule.getActivity().findViewById(R.id.yellowSquare);
-
rule.runOnUiThread(new Runnable() {
@Override
public void run() {
- redSquare.setVisibility(View.INVISIBLE);
- greenSquare.setVisibility(View.INVISIBLE);
- blueSquare.setVisibility(View.INVISIBLE);
- yellowSquare.setVisibility(View.INVISIBLE);
+ mRedSquare.setVisibility(View.INVISIBLE);
+ mGreenSquare.setVisibility(View.INVISIBLE);
+ mBlueSquare.setVisibility(View.INVISIBLE);
+ mYellowSquare.setVisibility(View.INVISIBLE);
}
});
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
@@ -111,54 +130,64 @@
@Override
public void run() {
TransitionManager.beginDelayedTransition(mRoot, mTransition);
- redSquare.setVisibility(View.VISIBLE);
- greenSquare.setVisibility(View.VISIBLE);
- blueSquare.setVisibility(View.VISIBLE);
- yellowSquare.setVisibility(View.VISIBLE);
+ mRedSquare.setVisibility(View.VISIBLE);
+ mGreenSquare.setVisibility(View.VISIBLE);
+ mBlueSquare.setVisibility(View.VISIBLE);
+ mYellowSquare.setVisibility(View.VISIBLE);
}
});
waitForStart();
- assertEquals(View.VISIBLE, redSquare.getVisibility());
- assertEquals(View.VISIBLE, greenSquare.getVisibility());
- assertEquals(View.VISIBLE, blueSquare.getVisibility());
- assertEquals(View.VISIBLE, yellowSquare.getVisibility());
- float redStartX = redSquare.getTranslationX();
- float redStartY = redSquare.getTranslationY();
+ assertEquals(View.VISIBLE, mRedSquare.getVisibility());
+ assertEquals(View.VISIBLE, mGreenSquare.getVisibility());
+ assertEquals(View.VISIBLE, mBlueSquare.getVisibility());
+ assertEquals(View.VISIBLE, mYellowSquare.getVisibility());
- SystemClock.sleep(100);
- verifyTranslation(redSquare, true, true);
- verifyTranslation(greenSquare, false, true);
- verifyTranslation(blueSquare, false, false);
- verifyTranslation(yellowSquare, true, false);
- assertThat(redStartX, is(lessThan(redSquare.getTranslationX()))); // moving right
- assertThat(redStartY, is(lessThan(redSquare.getTranslationY()))); // moving down
+ verifyMovement(mRedSquare, Gravity.LEFT | Gravity.TOP, false);
+ verifyMovement(mGreenSquare, Gravity.RIGHT | Gravity.TOP, false);
+ verifyMovement(mBlueSquare, Gravity.RIGHT | Gravity.BOTTOM, false);
+ verifyMovement(mYellowSquare, Gravity.LEFT | Gravity.BOTTOM, false);
waitForEnd();
- verifyNoTranslation(redSquare);
- verifyNoTranslation(greenSquare);
- verifyNoTranslation(blueSquare);
- verifyNoTranslation(yellowSquare);
- assertEquals(View.VISIBLE, redSquare.getVisibility());
- assertEquals(View.VISIBLE, greenSquare.getVisibility());
- assertEquals(View.VISIBLE, blueSquare.getVisibility());
- assertEquals(View.VISIBLE, yellowSquare.getVisibility());
+ verifyNoTranslation(mRedSquare);
+ verifyNoTranslation(mGreenSquare);
+ verifyNoTranslation(mBlueSquare);
+ verifyNoTranslation(mYellowSquare);
+ assertEquals(View.VISIBLE, mRedSquare.getVisibility());
+ assertEquals(View.VISIBLE, mGreenSquare.getVisibility());
+ assertEquals(View.VISIBLE, mBlueSquare.getVisibility());
+ assertEquals(View.VISIBLE, mYellowSquare.getVisibility());
}
- private void verifyTranslation(View view, boolean goLeft, boolean goUp) {
- float translationX = view.getTranslationX();
- float translationY = view.getTranslationY();
-
- if (goLeft) {
- assertThat(translationX, is(lessThan(0.f)));
- } else {
- assertThat(translationX, is(greaterThan(0.f)));
+ private void verifyMovement(View v, int direction, boolean movingOut) {
+ final float startX = v.getTranslationX();
+ final float startY = v.getTranslationY();
+ final VerificationMode mode = timeout(1000).atLeastOnce();
+ if ((direction & Gravity.LEFT) == Gravity.LEFT) {
+ if (movingOut) {
+ verify(v, mode).setTranslationX(and(lt(0f), lt(startX)));
+ } else {
+ verify(v, mode).setTranslationX(and(lt(0f), gt(startX)));
+ }
+ } else if ((direction & Gravity.RIGHT) == Gravity.RIGHT) {
+ if (movingOut) {
+ verify(v, mode).setTranslationX(and(gt(0f), gt(startX)));
+ } else {
+ verify(v, mode).setTranslationX(and(gt(0f), lt(startX)));
+ }
}
-
- if (goUp) {
- assertThat(translationY, is(lessThan(0.f)));
- } else {
- assertThat(translationY, is(greaterThan(0.f)));
+ if ((direction & Gravity.TOP) == Gravity.TOP) {
+ if (movingOut) {
+ verify(v, mode).setTranslationY(and(lt(0f), lt(startY)));
+ } else {
+ verify(v, mode).setTranslationY(and(lt(0f), gt(startY)));
+ }
+ } else if ((direction & Gravity.BOTTOM) == Gravity.BOTTOM) {
+ if (movingOut) {
+ verify(v, mode).setTranslationY(and(gt(0f), gt(startY)));
+ } else {
+ verify(v, mode).setTranslationY(and(gt(0f), lt(startY)));
+ }
}
}
diff --git a/transition/src/androidTest/java/androidx/transition/SlideEdgeTest.java b/transition/src/androidTest/java/androidx/transition/SlideEdgeTest.java
index 9d60d22..0e56fe7 100644
--- a/transition/src/androidTest/java/androidx/transition/SlideEdgeTest.java
+++ b/transition/src/androidTest/java/androidx/transition/SlideEdgeTest.java
@@ -17,41 +17,51 @@
package androidx.transition;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.mockito.AdditionalMatchers.and;
+import static org.mockito.AdditionalMatchers.eq;
+import static org.mockito.AdditionalMatchers.gt;
+import static org.mockito.AdditionalMatchers.lt;
+import static org.mockito.AdditionalMatchers.not;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
+import android.graphics.Color;
import android.view.Gravity;
import android.view.View;
-import android.view.ViewGroup;
+import androidx.core.util.Pair;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.LargeTest;
import androidx.test.filters.MediumTest;
-import androidx.transition.test.R;
import org.junit.Test;
+import java.util.ArrayList;
+
@MediumTest
public class SlideEdgeTest extends BaseTransitionTest {
- private static final Object[][] sSlideEdgeArray = {
- {Gravity.START, "START"},
- {Gravity.END, "END"},
- {Gravity.LEFT, "LEFT"},
- {Gravity.TOP, "TOP"},
- {Gravity.RIGHT, "RIGHT"},
- {Gravity.BOTTOM, "BOTTOM"},
- };
+ private static final ArrayList<Pair<Integer, String>> SLIDE_EDGES = new ArrayList<>();
+
+ static {
+ SLIDE_EDGES.add(new Pair<>(Gravity.START, "START"));
+ SLIDE_EDGES.add(new Pair<>(Gravity.END, "END"));
+ SLIDE_EDGES.add(new Pair<>(Gravity.LEFT, "LEFT"));
+ SLIDE_EDGES.add(new Pair<>(Gravity.TOP, "TOP"));
+ SLIDE_EDGES.add(new Pair<>(Gravity.RIGHT, "RIGHT"));
+ SLIDE_EDGES.add(new Pair<>(Gravity.BOTTOM, "BOTTOM"));
+ }
@Test
- public void testSetSide() throws Throwable {
- for (int i = 0; i < sSlideEdgeArray.length; i++) {
- int slideEdge = (Integer) (sSlideEdgeArray[i][0]);
- String edgeName = (String) (sSlideEdgeArray[i][1]);
+ public void testSetSide() {
+ for (int i = 0, size = SLIDE_EDGES.size(); i < size; i++) {
+ final Pair<Integer, String> pair = SLIDE_EDGES.get(i);
+ int slideEdge = pair.first;
+ String edgeName = pair.second;
Slide slide = new Slide(slideEdge);
assertEquals("Edge not set properly in constructor " + edgeName,
slideEdge, slide.getSlideEdge());
@@ -66,203 +76,138 @@
@LargeTest
@Test
public void testSlideOut() throws Throwable {
- for (int i = 0; i < sSlideEdgeArray.length; i++) {
- final int slideEdge = (Integer) (sSlideEdgeArray[i][0]);
+ for (int i = 0, size = SLIDE_EDGES.size(); i < size; i++) {
+ int slideEdge = SLIDE_EDGES.get(i).first;
final Slide slide = new Slide(slideEdge);
final Transition.TransitionListener listener =
mock(Transition.TransitionListener.class);
slide.addListener(listener);
- rule.runOnUiThread(new Runnable() {
+ final View redSquare = spy(new View(rule.getActivity()));
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
- rule.getActivity().setContentView(R.layout.scene1);
+ redSquare.setBackgroundColor(Color.RED);
+ mRoot.addView(redSquare, 100, 100);
}
});
- InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
- final View redSquare = rule.getActivity().findViewById(R.id.redSquare);
- final View greenSquare = rule.getActivity().findViewById(R.id.greenSquare);
- final View hello = rule.getActivity().findViewById(R.id.hello);
- final ViewGroup sceneRoot = (ViewGroup) rule.getActivity().findViewById(R.id.holder);
rule.runOnUiThread(new Runnable() {
@Override
public void run() {
- TransitionManager.beginDelayedTransition(sceneRoot, slide);
+ TransitionManager.beginDelayedTransition(mRoot, slide);
redSquare.setVisibility(View.INVISIBLE);
- greenSquare.setVisibility(View.INVISIBLE);
- hello.setVisibility(View.INVISIBLE);
}
});
verify(listener, timeout(1000)).onTransitionStart(any(Transition.class));
- verify(listener, never()).onTransitionEnd(any(Transition.class));
assertEquals(View.VISIBLE, redSquare.getVisibility());
- assertEquals(View.VISIBLE, greenSquare.getVisibility());
- assertEquals(View.VISIBLE, hello.getVisibility());
float redStartX = redSquare.getTranslationX();
float redStartY = redSquare.getTranslationY();
- Thread.sleep(200);
- verifyTranslation(slideEdge, redSquare);
- verifyTranslation(slideEdge, greenSquare);
- verifyTranslation(slideEdge, hello);
-
- final float redMidX = redSquare.getTranslationX();
- final float redMidY = redSquare.getTranslationY();
-
switch (slideEdge) {
case Gravity.LEFT:
case Gravity.START:
- assertTrue(
- "isn't sliding out to left. Expecting " + redStartX + " > " + redMidX,
- redStartX > redMidX);
+ verify(redSquare, timeout(1000).atLeastOnce())
+ .setTranslationX(and(lt(0.f), lt(redStartX)));
+ verify(redSquare, never()).setTranslationY(not(eq(0f, 0.01f)));
break;
case Gravity.RIGHT:
case Gravity.END:
- assertTrue(
- "isn't sliding out to right. Expecting " + redStartX + " < " + redMidX,
- redStartX < redMidX);
+ verify(redSquare, timeout(1000).atLeastOnce())
+ .setTranslationX(and(gt(0.f), gt(redStartX)));
+ verify(redSquare, never()).setTranslationY(not(eq(0f, 0.01f)));
break;
case Gravity.TOP:
- assertTrue("isn't sliding out to top. Expecting " + redStartY + " > " + redMidY,
- redStartY > redSquare.getTranslationY());
+ verify(redSquare, timeout(1000).atLeastOnce())
+ .setTranslationY(and(lt(0.f), lt(redStartY)));
+ verify(redSquare, never()).setTranslationX(not(eq(0f, 0.01f)));
break;
case Gravity.BOTTOM:
- assertTrue(
- "isn't sliding out to bottom. Expecting " + redStartY + " < " + redMidY,
- redStartY < redSquare.getTranslationY());
+ verify(redSquare, timeout(1000).atLeastOnce())
+ .setTranslationY(and(gt(0.f), gt(redStartY)));
+ verify(redSquare, never()).setTranslationX(not(eq(0f, 0.01f)));
break;
+ default:
+ throw new IllegalArgumentException("Incorrect slideEdge");
}
+
verify(listener, timeout(1000)).onTransitionEnd(any(Transition.class));
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
verifyNoTranslation(redSquare);
- verifyNoTranslation(greenSquare);
- verifyNoTranslation(hello);
assertEquals(View.INVISIBLE, redSquare.getVisibility());
- assertEquals(View.INVISIBLE, greenSquare.getVisibility());
- assertEquals(View.INVISIBLE, hello.getVisibility());
}
}
@LargeTest
@Test
public void testSlideIn() throws Throwable {
- for (int i = 0; i < sSlideEdgeArray.length; i++) {
- final int slideEdge = (Integer) (sSlideEdgeArray[i][0]);
+ for (int i = 0, size = SLIDE_EDGES.size(); i < size; i++) {
+ final Pair<Integer, String> pair = SLIDE_EDGES.get(i);
+ int slideEdge = pair.first;
final Slide slide = new Slide(slideEdge);
final Transition.TransitionListener listener =
mock(Transition.TransitionListener.class);
slide.addListener(listener);
- rule.runOnUiThread(new Runnable() {
+
+ final View redSquare = spy(new View(rule.getActivity()));
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
@Override
public void run() {
- rule.getActivity().setContentView(R.layout.scene1);
- }
- });
- InstrumentationRegistry.getInstrumentation().waitForIdleSync();
-
- final View redSquare = rule.getActivity().findViewById(R.id.redSquare);
- final View greenSquare = rule.getActivity().findViewById(R.id.greenSquare);
- final View hello = rule.getActivity().findViewById(R.id.hello);
- final ViewGroup sceneRoot = (ViewGroup) rule.getActivity().findViewById(R.id.holder);
-
- rule.runOnUiThread(new Runnable() {
- @Override
- public void run() {
+ redSquare.setBackgroundColor(Color.RED);
+ mRoot.addView(redSquare, 100, 100);
redSquare.setVisibility(View.INVISIBLE);
- greenSquare.setVisibility(View.INVISIBLE);
- hello.setVisibility(View.INVISIBLE);
}
});
- InstrumentationRegistry.getInstrumentation().waitForIdleSync();
// now slide in
rule.runOnUiThread(new Runnable() {
@Override
public void run() {
- TransitionManager.beginDelayedTransition(sceneRoot, slide);
+ TransitionManager.beginDelayedTransition(mRoot, slide);
redSquare.setVisibility(View.VISIBLE);
- greenSquare.setVisibility(View.VISIBLE);
- hello.setVisibility(View.VISIBLE);
}
});
- verify(listener, timeout(1000)).onTransitionStart(any(Transition.class));
- verify(listener, never()).onTransitionEnd(any(Transition.class));
+ verify(listener, timeout(1000)).onTransitionStart(any(Transition.class));
assertEquals(View.VISIBLE, redSquare.getVisibility());
- assertEquals(View.VISIBLE, greenSquare.getVisibility());
- assertEquals(View.VISIBLE, hello.getVisibility());
final float redStartX = redSquare.getTranslationX();
final float redStartY = redSquare.getTranslationY();
- Thread.sleep(200);
- verifyTranslation(slideEdge, redSquare);
- verifyTranslation(slideEdge, greenSquare);
- verifyTranslation(slideEdge, hello);
- final float redMidX = redSquare.getTranslationX();
- final float redMidY = redSquare.getTranslationY();
-
switch (slideEdge) {
case Gravity.LEFT:
case Gravity.START:
- assertTrue(
- "isn't sliding in from left. Expecting " + redStartX + " < " + redMidX,
- redStartX < redMidX);
+ verify(redSquare, timeout(1000).atLeastOnce())
+ .setTranslationX(and(gt(redStartX), lt(0.f)));
+ verify(redSquare, never()).setTranslationY(not(eq(0f, 0.01f)));
break;
case Gravity.RIGHT:
case Gravity.END:
- assertTrue(
- "isn't sliding in from right. Expecting " + redStartX + " > " + redMidX,
- redStartX > redMidX);
+ verify(redSquare, timeout(1000).atLeastOnce())
+ .setTranslationX(and(gt(0.f), lt(redStartX)));
+ verify(redSquare, never()).setTranslationY(not(eq(0f, 0.01f)));
break;
case Gravity.TOP:
- assertTrue(
- "isn't sliding in from top. Expecting " + redStartY + " < " + redMidY,
- redStartY < redSquare.getTranslationY());
+ verify(redSquare, timeout(1000).atLeastOnce())
+ .setTranslationY(and(gt(redStartY), lt(0.f)));
+ verify(redSquare, never()).setTranslationX(not(eq(0f, 0.01f)));
break;
case Gravity.BOTTOM:
- assertTrue("isn't sliding in from bottom. Expecting " + redStartY + " > "
- + redMidY,
- redStartY > redSquare.getTranslationY());
+ verify(redSquare, timeout(1000).atLeastOnce())
+ .setTranslationY(and(gt(0.f), lt(redStartY)));
+ verify(redSquare, never()).setTranslationX(not(eq(0f, 0.01f)));
break;
+ default:
+ throw new IllegalArgumentException("Incorrect slideEdge");
}
verify(listener, timeout(1000)).onTransitionEnd(any(Transition.class));
InstrumentationRegistry.getInstrumentation().waitForIdleSync();
verifyNoTranslation(redSquare);
- verifyNoTranslation(greenSquare);
- verifyNoTranslation(hello);
assertEquals(View.VISIBLE, redSquare.getVisibility());
- assertEquals(View.VISIBLE, greenSquare.getVisibility());
- assertEquals(View.VISIBLE, hello.getVisibility());
- }
- }
-
- private void verifyTranslation(int slideEdge, View view) {
- switch (slideEdge) {
- case Gravity.LEFT:
- case Gravity.START:
- assertTrue(view.getTranslationX() < 0);
- assertEquals(0f, view.getTranslationY(), 0.01f);
- break;
- case Gravity.RIGHT:
- case Gravity.END:
- assertTrue(view.getTranslationX() > 0);
- assertEquals(0f, view.getTranslationY(), 0.01f);
- break;
- case Gravity.TOP:
- assertTrue(view.getTranslationY() < 0);
- assertEquals(0f, view.getTranslationX(), 0.01f);
- break;
- case Gravity.BOTTOM:
- assertTrue(view.getTranslationY() > 0);
- assertEquals(0f, view.getTranslationX(), 0.01f);
- break;
}
}
diff --git a/transition/src/androidTest/java/androidx/transition/TransitionActivity.java b/transition/src/androidTest/java/androidx/transition/TransitionActivity.java
index a155a65..6fa1fe1 100644
--- a/transition/src/androidTest/java/androidx/transition/TransitionActivity.java
+++ b/transition/src/androidTest/java/androidx/transition/TransitionActivity.java
@@ -18,6 +18,7 @@
import android.os.Bundle;
import android.view.ViewGroup;
+import android.view.WindowManager;
import android.widget.LinearLayout;
import androidx.fragment.app.FragmentActivity;
@@ -30,6 +31,8 @@
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
+ | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
setContentView(R.layout.activity_transition);
mRoot = findViewById(R.id.root);
}