blob: 2b42469508325d77afce04862ca567aa5634d5de [file] [log] [blame]
package org.robolectric.shadows;
import static android.os.Build.VERSION_CODES.LOLLIPOP;
import static org.assertj.core.api.Assertions.assertThat;
import static org.robolectric.Shadows.shadowOf;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.Parcel;
import android.view.View;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction;
import android.view.accessibility.AccessibilityWindowInfo;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class)
public class ShadowAccessibilityNodeInfoTest {
private AccessibilityNodeInfo node;
private ShadowAccessibilityNodeInfo shadow;
@Before
public void setUp() {
ShadowAccessibilityNodeInfo.resetObtainedInstances();
assertThat(ShadowAccessibilityNodeInfo.areThereUnrecycledNodes(true)).isEqualTo(false);
node = AccessibilityNodeInfo.obtain();
}
@Test
public void shouldHaveObtainedNode() {
assertThat(ShadowAccessibilityNodeInfo.areThereUnrecycledNodes(false)).isEqualTo(true);
}
@Test
public void shouldHaveZeroBounds() {
Rect outBounds = new Rect();
node.getBoundsInParent(outBounds);
assertThat(outBounds.left).isEqualTo(0);
}
@Test
public void shouldHaveClonedCorrectly() {
node.setAccessibilityFocused(true);
node.setBoundsInParent(new Rect(0, 0, 100, 100));
node.setContentDescription("test");
AccessibilityNodeInfo anotherNode = AccessibilityNodeInfo.obtain(node);
assertThat(anotherNode).isEqualTo(node);
assertThat(anotherNode.getContentDescription().toString()).isEqualTo("test");
}
@Test
public void shouldWriteAndReadFromParcelCorrectly() {
Parcel p = Parcel.obtain();
node.setContentDescription("test");
node.writeToParcel(p, 0);
p.setDataPosition(0);
AccessibilityNodeInfo anotherNode = AccessibilityNodeInfo.CREATOR.createFromParcel(p);
assertThat(node).isEqualTo(anotherNode);
node.setContentDescription(null);
}
@Test
public void shouldNotHaveInfiniteLoopWithSameLoopedChildren() {
node = AccessibilityNodeInfo.obtain();
AccessibilityNodeInfo child = AccessibilityNodeInfo.obtain();
shadowOf(node).addChild(child);
shadowOf(child).addChild(node);
AccessibilityNodeInfo anotherNode = AccessibilityNodeInfo.obtain(node);
assertThat(node).isEqualTo(anotherNode);
}
@Test
public void shouldNotHaveInfiniteLoopWithDifferentLoopedChildren() {
node = AccessibilityNodeInfo.obtain();
shadow = shadowOf(node);
AccessibilityNodeInfo child1 = AccessibilityNodeInfo.obtain();
shadow.addChild(child1);
ShadowAccessibilityNodeInfo child1Shadow = shadowOf(child1);
child1Shadow.addChild(node);
AccessibilityNodeInfo anotherNode = ShadowAccessibilityNodeInfo.obtain();
AccessibilityNodeInfo child2 = ShadowAccessibilityNodeInfo.obtain();
child2.setText("test");
ShadowAccessibilityNodeInfo child2Shadow = shadowOf(child2);
ShadowAccessibilityNodeInfo anotherNodeShadow = shadowOf(anotherNode);
anotherNodeShadow.addChild(child2);
child2Shadow.addChild(anotherNode);
assertThat(node).isNotEqualTo(anotherNode);
}
@Test
@Config(minSdk = LOLLIPOP)
public void shouldRecordFlagsProperly() {
node = AccessibilityNodeInfo.obtain();
node.setClickable(false);
shadow = shadowOf(node);
shadow.setPasteable(false);
assertThat(shadow.isClickable()).isEqualTo(false);
assertThat(shadow.isPasteable()).isEqualTo(false);
node.setText("Test");
shadow.setTextSelectionSetable(true);
shadow.addAction(AccessibilityNodeInfo.ACTION_SET_SELECTION);
node.setTextSelection(0, 1);
assertThat(shadow.getActions()).isEqualTo(AccessibilityNodeInfo.ACTION_SET_SELECTION);
assertThat(shadow.getTextSelectionStart()).isEqualTo(0);
assertThat(shadow.getTextSelectionEnd()).isEqualTo(1);
AccessibilityWindowInfo window = ShadowAccessibilityWindowInfo.obtain();
shadow.setAccessibilityWindowInfo(window);
assertThat(node.getWindow()).isEqualTo(window);
shadow.setAccessibilityWindowInfo(null);
// Remove action was added in API 21
node.removeAction(AccessibilityAction.ACTION_SET_SELECTION);
shadow.setPasteable(true);
shadow.setTextSelectionSetable(false);
node.addAction(AccessibilityNodeInfo.ACTION_PASTE);
assertThat(shadow.getActions()).isEqualTo(AccessibilityNodeInfo.ACTION_PASTE);
node.setClickable(true);
assertThat(shadow.isClickable()).isEqualTo(true);
node.setClickable(false);
shadow.setPasteable(false);
node.removeAction(AccessibilityNodeInfo.ACTION_PASTE);
node.addAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
assertThat(shadow.getActions()).isEqualTo(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
node.removeAction(AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS);
}
@Test
public void shouldRecordActionsPerformed() {
node.setClickable(true);
node.addAction(AccessibilityNodeInfo.ACTION_CLICK);
shadow = shadowOf(node);
shadow.setOnPerformActionListener(new ShadowAccessibilityNodeInfo.OnPerformActionListener() {
@Override
public boolean onPerformAccessibilityAction(int action, Bundle arguments) {
if (action == AccessibilityNodeInfo.ACTION_CLICK) {
return true;
} else {
return false;
}
}
});
boolean clickResult = node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
assertThat(clickResult).isEqualTo(true);
assertThat(shadow.getPerformedActions().isEmpty()).isEqualTo(false);
assertThat(shadow.getPerformedActions().get(0)).isEqualTo(AccessibilityNodeInfo.ACTION_CLICK);
boolean longClickResult = node.performAction(AccessibilityNodeInfo.ACTION_LONG_CLICK);
assertThat(longClickResult).isEqualTo(false);
assertThat(shadow.getPerformedActions().size()).isEqualTo(2);
assertThat(shadow.getPerformedActions().get(1))
.isEqualTo(AccessibilityNodeInfo.ACTION_LONG_CLICK);
}
@Test
public void equalsTest_unrelatedNodesAreUnequal() {
AccessibilityNodeInfo nodeA = AccessibilityNodeInfo.obtain();
AccessibilityNodeInfo nodeB = AccessibilityNodeInfo.obtain();
shadowOf(nodeA).setText("test");
shadowOf(nodeB).setText("test");
assertThat(nodeA).isNotEqualTo(nodeB);
}
@Test
public void equalsTest_nodesFromTheSameViewAreEqual() {
View view = new View(RuntimeEnvironment.application);
AccessibilityNodeInfo nodeA = AccessibilityNodeInfo.obtain(view);
AccessibilityNodeInfo nodeB = AccessibilityNodeInfo.obtain(view);
shadowOf(nodeA).setText("tomato");
shadowOf(nodeB).setText("tomatoe");
assertThat(nodeA).isEqualTo(nodeB);
}
@Test
public void equalsTest_nodesFromDifferentViewsAreNotEqual() {
View viewA = new View(RuntimeEnvironment.application);
View viewB = new View(RuntimeEnvironment.application);
AccessibilityNodeInfo nodeA = AccessibilityNodeInfo.obtain(viewA);
AccessibilityNodeInfo nodeB = AccessibilityNodeInfo.obtain(viewB);
shadowOf(nodeA).setText("test");
shadowOf(nodeB).setText("test");
assertThat(nodeA).isNotEqualTo(nodeB);
}
@Test
public void equalsTest_nodeIsEqualToItsClone_evenWhenModified() {
node = AccessibilityNodeInfo.obtain();
AccessibilityNodeInfo clone = AccessibilityNodeInfo.obtain(node);
shadowOf(clone).setText("test");
assertThat(node).isEqualTo(clone);
}
@After
public void tearDown() {
ShadowAccessibilityNodeInfo.resetObtainedInstances();
assertThat(ShadowAccessibilityNodeInfo.areThereUnrecycledNodes(true)).isEqualTo(false);
}
}