blob: f7c1e7a55e5c4c03ca85dbc4f899a80db4c99de0 [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.view.cts;
import android.os.Message;
import android.os.Parcel;
import android.test.suitebuilder.annotation.MediumTest;
import android.view.accessibility.AccessibilityEvent;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Iterator;
import java.util.List;
import junit.framework.TestCase;
/**
* Class for testing {@link AccessibilityEvent}.
*/
public class AccessibilityEventTest extends TestCase {
/** The number of properties of the {@link AccessibilityEvent} class. */
private static final int NON_STATIC_FIELD_COUNT = 16;
@MediumTest
public void testMarshalling() throws Exception {
// no new fields, so we are testing marshaling of all such
assertNoNewNonStaticFieldsAdded();
// fully populate the event to marshal
AccessibilityEvent sentEvent = AccessibilityEvent.obtain();
fullyPopulateSentAccessibilityEvent(sentEvent);
// marshal and unmarshal the event
Parcel parcel = Parcel.obtain();
sentEvent.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
AccessibilityEvent receivedEvent = AccessibilityEvent.CREATOR.createFromParcel(parcel);
// make sure all fields properly marshaled
assertEqualsAccessiblityEvent(sentEvent, receivedEvent);
}
/**
* Tests if {@link AccessibilityEvent} are properly reused.
*/
@MediumTest
public void testReuse() {
AccessibilityEvent firstEvent = AccessibilityEvent.obtain();
firstEvent.recycle();
AccessibilityEvent secondEvent = AccessibilityEvent.obtain();
assertSame("AccessibilityEvent not properly reused", firstEvent, secondEvent);
}
/**
* Tests if {@link AccessibilityEvent} are properly recycled.
*/
@MediumTest
public void testRecycle() {
// obtain and populate an event
AccessibilityEvent populatedEvent = AccessibilityEvent.obtain();
fullyPopulateSentAccessibilityEvent(populatedEvent);
// recycle and obtain the same recycled instance
populatedEvent.recycle();
AccessibilityEvent recycledEvent = AccessibilityEvent.obtain();
// check expectations
assertAccessibilityEventCleared(recycledEvent);
}
/**
* Asserts that no new fields have been added, so we are testing marshaling
* of all such.
*/
private void assertNoNewNonStaticFieldsAdded() {
int nonStaticFieldCount = 0;
for (Field field : AccessibilityEvent.class.getDeclaredFields()) {
if ((field.getModifiers() & Modifier.STATIC) == 0) {
nonStaticFieldCount++;
}
}
String message = "New fields have been added, so add code to test marchalling them.";
assertEquals(message, NON_STATIC_FIELD_COUNT, nonStaticFieldCount);
}
/**
* Fully populates the {@link AccessibilityEvent} to marshal.
*
* @param sentEvent The event to populate.
*/
private void fullyPopulateSentAccessibilityEvent(AccessibilityEvent sentEvent) {
sentEvent.setAddedCount(1);
sentEvent.setBeforeText("BeforeText");
sentEvent.setChecked(true);
sentEvent.setClassName("foo.bar.baz.Class");
sentEvent.setContentDescription("ContentDescription");
sentEvent.setCurrentItemIndex(1);
sentEvent.setEnabled(true);
sentEvent.setEventType(AccessibilityEvent.TYPE_VIEW_FOCUSED);
sentEvent.setEventTime(1000);
sentEvent.setFromIndex(1);
sentEvent.setFullScreen(true);
sentEvent.setItemCount(1);
sentEvent.setPackageName("foo.bar.baz");
sentEvent.setParcelableData(Message.obtain(null, 1, 2, 3));
sentEvent.setPassword(true);
sentEvent.setRemovedCount(1);
sentEvent.getText().add("Foo");
}
/**
* Compares all properties of the <code>expectedEvent</code> and the
* <code>receviedEvent</code> to verify that the received event is the one
* that is expected.
*/
public static void assertEqualsAccessiblityEvent(AccessibilityEvent expectedEvent,
AccessibilityEvent receivedEvent) {
assertEquals("addedCount has incorrect value", expectedEvent.getAddedCount(), receivedEvent
.getAddedCount());
assertEquals("beforeText has incorrect value", expectedEvent.getBeforeText(), receivedEvent
.getBeforeText());
assertEquals("checked has incorrect value", expectedEvent.isChecked(), receivedEvent
.isChecked());
assertEquals("className has incorrect value", expectedEvent.getClassName(), receivedEvent
.getClassName());
assertEquals("contentDescription has incorrect value", expectedEvent
.getContentDescription(), receivedEvent.getContentDescription());
assertEquals("currentItemIndex has incorrect value", expectedEvent.getCurrentItemIndex(),
receivedEvent.getCurrentItemIndex());
assertEquals("enabled has incorrect value", expectedEvent.isEnabled(), receivedEvent
.isEnabled());
assertEquals("eventType has incorrect value", expectedEvent.getEventType(), receivedEvent
.getEventType());
assertEquals("fromIndex has incorrect value", expectedEvent.getFromIndex(), receivedEvent
.getFromIndex());
assertEquals("fullScreen has incorrect value", expectedEvent.isFullScreen(), receivedEvent
.isFullScreen());
assertEquals("itemCount has incorrect value", expectedEvent.getItemCount(), receivedEvent
.getItemCount());
assertEquals("password has incorrect value", expectedEvent.isPassword(), receivedEvent
.isPassword());
assertEquals("removedCount has incorrect value", expectedEvent.getRemovedCount(),
receivedEvent.getRemovedCount());
assertEqualsText(expectedEvent, receivedEvent);
}
/**
* Compares the text of the <code>expectedEvent</code> and
* <code>receivedEvent</code> by comparing the string representation of the
* corresponding {@link CharSequence}s.
*/
public static void assertEqualsText(AccessibilityEvent expectedEvent,
AccessibilityEvent receivedEvent) {
String message = "text has incorrect value";
List<CharSequence> expectedText = expectedEvent.getText();
List<CharSequence> receivedText = receivedEvent.getText();
TestCase.assertEquals(message, expectedText.size(), receivedText.size());
Iterator<CharSequence> expectedTextIterator = expectedText.iterator();
Iterator<CharSequence> receivedTextIterator = receivedText.iterator();
for (int i = 0; i < expectedText.size(); i++) {
// compare the string representation
TestCase.assertEquals(message, expectedTextIterator.next().toString(),
receivedTextIterator.next().toString());
}
}
/**
* Asserts that an {@link AccessibilityEvent} is cleared.
*
* @param event The event to check.
*/
public static void assertAccessibilityEventCleared(AccessibilityEvent event) {
TestCase.assertEquals("addedCount not properly recycled", 0, event.getAddedCount());
TestCase.assertNull("beforeText not properly recycled", event.getBeforeText());
TestCase.assertNull("className not properly recycled", event.getClassName());
TestCase.assertNull("contentDescription not properly recycled", event
.getContentDescription());
TestCase.assertEquals("currentItemIndex not properly recycled", -1, event
.getCurrentItemIndex());
TestCase.assertEquals("eventTime not properly recycled", 0, event.getEventTime());
TestCase.assertEquals("eventType not properly recycled", 0, event.getEventType());
TestCase.assertEquals("fromIndex not properly recycled", 0, event.getFromIndex());
TestCase.assertEquals("itemCount not properly recycled", 0, event.getItemCount());
TestCase.assertNull("packageName not properly recycled", event.getPackageName());
TestCase.assertNull("parcelableData not properly recycled", event.getParcelableData());
TestCase.assertEquals("removedCount not properly recycled", 0, event.getRemovedCount());
TestCase.assertTrue("text not properly recycled", event.getText().isEmpty());
}
}