blob: bad7d06b47ea1121f2476cac81a6fe4f2c76f80a [file] [log] [blame]
/*
* Copyright (C) 2018 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.textclassifier.cts;
import static com.google.common.truth.Truth.assertThat;
import android.icu.util.ULocale;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.view.textclassifier.TextClassificationContext;
import android.view.textclassifier.TextClassifier;
import android.view.textclassifier.TextClassifierEvent;
import android.widget.TextView;
import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidJUnit4.class)
public class TextClassifierEventTest {
private static final float TOLERANCE = 0.000001f;
private static final String MODEL_NAME = "model_name";
@Test
public void testTextSelectionEvent_minimal() {
final TextClassifierEvent.TextSelectionEvent event = createMinimalTextSelectionEvent();
TextClassifierEvent.TextSelectionEvent result =
parcelizeDeparcelize(event, TextClassifierEvent.TextSelectionEvent.CREATOR);
assertMinimalTextSelectionEvent(event);
assertMinimalTextSelectionEvent(result);
}
@Test
public void testTextSelectionEvent_full() {
final TextClassifierEvent.TextSelectionEvent event = createFullTextSelectionEvent();
TextClassifierEvent.TextSelectionEvent result =
parcelizeDeparcelize(event, TextClassifierEvent.TextSelectionEvent.CREATOR);
assertFullTextSelectionEvent(event);
assertFullTextSelectionEvent(result);
}
@Test
public void testTextLinkifyEvent_minimal() {
final TextClassifierEvent.TextLinkifyEvent event = createMinimalTextLinkifyEvent();
TextClassifierEvent.TextLinkifyEvent result =
parcelizeDeparcelize(event, TextClassifierEvent.TextLinkifyEvent.CREATOR);
assertMinimalTextLinkifyEvent(event);
assertMinimalTextLinkifyEvent(result);
}
@Test
public void testTextLinkifyEvent_full() {
final TextClassifierEvent.TextLinkifyEvent event = createFullTextLinkifyEvent();
TextClassifierEvent.TextLinkifyEvent result =
parcelizeDeparcelize(event, TextClassifierEvent.TextLinkifyEvent.CREATOR);
assertFullTextLinkifyEvent(event);
assertFullTextLinkifyEvent(result);
}
@Test
public void testConversationActionsEvent_minimal() {
final TextClassifierEvent.ConversationActionsEvent event =
createMinimalConversationActionsEvent();
TextClassifierEvent.ConversationActionsEvent result =
parcelizeDeparcelize(event, TextClassifierEvent.ConversationActionsEvent.CREATOR);
assertMinimalConversationActionsEvent(event);
assertMinimalConversationActionsEvent(result);
}
@Test
public void testConversationActionsEvent_full() {
final TextClassifierEvent.ConversationActionsEvent event =
createFullConversationActionsEvent();
TextClassifierEvent.ConversationActionsEvent result =
parcelizeDeparcelize(event, TextClassifierEvent.ConversationActionsEvent.CREATOR);
assertFullConversationActionsEvent(event);
assertFullConversationActionsEvent(result);
}
@Test
public void testLanguageDetectionEvent_minimal() {
final TextClassifierEvent.LanguageDetectionEvent event =
createMinimalLanguageDetectionEvent();
TextClassifierEvent.LanguageDetectionEvent result =
parcelizeDeparcelize(event, TextClassifierEvent.LanguageDetectionEvent.CREATOR);
assertMinimalLanguageDetectionEvent(event);
assertMinimalLanguageDetectionEvent(result);
}
@Test
public void testLanguageDetectionEvent_full() {
final TextClassifierEvent.LanguageDetectionEvent event =
createFullLanguageDetectionEvent();
TextClassifierEvent.LanguageDetectionEvent result =
parcelizeDeparcelize(event, TextClassifierEvent.LanguageDetectionEvent.CREATOR);
assertFullLanguageDetectionEvent(event);
assertFullLanguageDetectionEvent(result);
}
private TextClassifierEvent.TextSelectionEvent createMinimalTextSelectionEvent() {
return new TextClassifierEvent.TextSelectionEvent.Builder(
TextClassifierEvent.TYPE_SELECTION_DESTROYED)
.build();
}
private void assertMinimalTextSelectionEvent(TextClassifierEvent.TextSelectionEvent event) {
assertThat(event.getEventCategory()).isEqualTo(TextClassifierEvent.CATEGORY_SELECTION);
assertThat(event.getEventType()).isEqualTo(TextClassifierEvent.TYPE_SELECTION_DESTROYED);
assertThat(event.getEventIndex()).isEqualTo(0);
assertThat(event.getEntityTypes()).isEmpty();
assertThat(event.getRelativeWordStartIndex()).isEqualTo(0);
assertThat(event.getRelativeWordEndIndex()).isEqualTo(0);
assertThat(event.getRelativeSuggestedWordStartIndex()).isEqualTo(0);
assertThat(event.getRelativeSuggestedWordEndIndex()).isEqualTo(0);
assertThat(event.getResultId()).isNull();
assertThat(event.getActionIndices()).isEmpty();
assertThat(event.getExtras().size()).isEqualTo(0);
assertThat(event.getEventContext()).isNull();
assertThat(event.getEntityTypes()).isEmpty();
assertThat(event.getLocale()).isNull();
assertThat(event.getModelName()).isNull();
}
private TextClassifierEvent.TextSelectionEvent createFullTextSelectionEvent() {
final Bundle extra = new Bundle();
extra.putString("key", "value");
return new TextClassifierEvent.TextSelectionEvent.Builder(
TextClassifierEvent.TYPE_SELECTION_STARTED)
.setEventIndex(2)
.setEntityTypes(TextClassifier.TYPE_ADDRESS)
.setRelativeWordStartIndex(1)
.setRelativeWordEndIndex(2)
.setRelativeSuggestedWordStartIndex(-1)
.setRelativeSuggestedWordEndIndex(3)
.setResultId("androidtc-en-v606-1234")
.setActionIndices(1, 2, 5)
.setExtras(extra)
.setEventContext(new TextClassificationContext.Builder(
"pkg", TextClassifier.WIDGET_TYPE_TEXTVIEW)
.setWidgetVersion(TextView.class.getName())
.build())
.setScores(0.5f)
.setEntityTypes(TextClassifier.TYPE_ADDRESS, TextClassifier.TYPE_DATE)
.setLocale(ULocale.US)
.setModelName(MODEL_NAME)
.build();
}
private void assertFullTextSelectionEvent(TextClassifierEvent.TextSelectionEvent event) {
assertThat(event.getEventCategory()).isEqualTo(TextClassifierEvent.CATEGORY_SELECTION);
assertThat(event.getEventType()).isEqualTo(TextClassifierEvent.TYPE_SELECTION_STARTED);
assertThat(event.getEventIndex()).isEqualTo(2);
assertThat(event.getEntityTypes()).asList()
.containsExactly(TextClassifier.TYPE_ADDRESS, TextClassifier.TYPE_DATE);
assertThat(event.getRelativeWordStartIndex()).isEqualTo(1);
assertThat(event.getRelativeWordEndIndex()).isEqualTo(2);
assertThat(event.getRelativeSuggestedWordStartIndex()).isEqualTo(-1);
assertThat(event.getRelativeSuggestedWordEndIndex()).isEqualTo(3);
assertThat(event.getResultId()).isEqualTo("androidtc-en-v606-1234");
assertThat(event.getActionIndices()).asList().containsExactly(1, 2, 5);
assertThat(event.getExtras().get("key")).isEqualTo("value");
assertThat(event.getEventContext().getPackageName()).isEqualTo("pkg");
assertThat(event.getEventContext().getWidgetType())
.isEqualTo(TextClassifier.WIDGET_TYPE_TEXTVIEW);
assertThat(event.getEventContext().getWidgetVersion()).isEqualTo(TextView.class.getName());
assertThat(event.getScores()).hasLength(1);
assertThat(event.getScores()[0]).isWithin(TOLERANCE).of(0.5f);
assertThat(event.getLocale()).isEqualTo(ULocale.US);
assertThat(event.getModelName()).isEqualTo(MODEL_NAME);
}
private TextClassifierEvent.TextLinkifyEvent createMinimalTextLinkifyEvent() {
return new TextClassifierEvent.TextLinkifyEvent.Builder(
TextClassifierEvent.TYPE_LINK_CLICKED)
.build();
}
private void assertMinimalTextLinkifyEvent(TextClassifierEvent.TextLinkifyEvent event) {
assertThat(event.getEventCategory()).isEqualTo(TextClassifierEvent.CATEGORY_LINKIFY);
assertThat(event.getEventType()).isEqualTo(TextClassifierEvent.TYPE_LINK_CLICKED);
assertThat(event.getEventIndex()).isEqualTo(0);
assertThat(event.getEntityTypes()).isEmpty();
assertThat(event.getResultId()).isNull();
assertThat(event.getActionIndices()).isEmpty();
assertThat(event.getExtras().size()).isEqualTo(0);
assertThat(event.getEventContext()).isNull();
assertThat(event.getEntityTypes()).isEmpty();
assertThat(event.getLocale()).isNull();
assertThat(event.getModelName()).isNull();
}
private TextClassifierEvent.TextLinkifyEvent createFullTextLinkifyEvent() {
final Bundle extra = new Bundle();
extra.putString("key", "value");
return new TextClassifierEvent.TextLinkifyEvent.Builder(
TextClassifierEvent.TYPE_LINK_CLICKED)
.setEventIndex(2)
.setEntityTypes(TextClassifier.TYPE_ADDRESS)
.setResultId("androidtc-en-v606-1234")
.setActionIndices(1, 2, 5)
.setExtras(extra)
.setEventContext(new TextClassificationContext.Builder(
"pkg", TextClassifier.WIDGET_TYPE_TEXTVIEW)
.setWidgetVersion(TextView.class.getName())
.build())
.setScores(0.5f)
.setEntityTypes(TextClassifier.TYPE_ADDRESS, TextClassifier.TYPE_DATE)
.setLocale(ULocale.US)
.setModelName(MODEL_NAME)
.build();
}
private void assertFullTextLinkifyEvent(TextClassifierEvent.TextLinkifyEvent event) {
assertThat(event.getEventCategory()).isEqualTo(TextClassifierEvent.CATEGORY_LINKIFY);
assertThat(event.getEventType()).isEqualTo(TextClassifierEvent.TYPE_LINK_CLICKED);
assertThat(event.getEventIndex()).isEqualTo(2);
assertThat(event.getEntityTypes()).asList()
.containsExactly(TextClassifier.TYPE_ADDRESS, TextClassifier.TYPE_DATE);
assertThat(event.getResultId()).isEqualTo("androidtc-en-v606-1234");
assertThat(event.getActionIndices()).asList().containsExactly(1, 2, 5);
assertThat(event.getExtras().get("key")).isEqualTo("value");
assertThat(event.getEventContext().getPackageName()).isEqualTo("pkg");
assertThat(event.getEventContext().getWidgetType())
.isEqualTo(TextClassifier.WIDGET_TYPE_TEXTVIEW);
assertThat(event.getEventContext().getWidgetVersion()).isEqualTo(TextView.class.getName());
assertThat(event.getScores()).hasLength(1);
assertThat(event.getScores()[0]).isWithin(TOLERANCE).of(0.5f);
assertThat(event.getLocale()).isEqualTo(ULocale.US);
assertThat(event.getModelName()).isEqualTo(MODEL_NAME);
}
private TextClassifierEvent.ConversationActionsEvent createMinimalConversationActionsEvent() {
return new TextClassifierEvent.ConversationActionsEvent.Builder(
TextClassifierEvent.TYPE_ACTIONS_SHOWN)
.build();
}
private void assertMinimalConversationActionsEvent(
TextClassifierEvent.ConversationActionsEvent event) {
assertThat(event.getEventCategory()).isEqualTo(
TextClassifierEvent.CATEGORY_CONVERSATION_ACTIONS);
assertThat(event.getEventType()).isEqualTo(TextClassifierEvent.TYPE_ACTIONS_SHOWN);
assertThat(event.getEventIndex()).isEqualTo(0);
assertThat(event.getEntityTypes()).isEmpty();
assertThat(event.getResultId()).isNull();
assertThat(event.getActionIndices()).isEmpty();
assertThat(event.getExtras().size()).isEqualTo(0);
assertThat(event.getEventContext()).isNull();
assertThat(event.getEntityTypes()).isEmpty();
assertThat(event.getLocale()).isNull();
assertThat(event.getModelName()).isNull();
}
private TextClassifierEvent.ConversationActionsEvent createFullConversationActionsEvent() {
final Bundle extra = new Bundle();
extra.putString("key", "value");
return new TextClassifierEvent.ConversationActionsEvent.Builder(
TextClassifierEvent.TYPE_ACTIONS_SHOWN)
.setEventIndex(2)
.setEntityTypes(TextClassifier.TYPE_ADDRESS)
.setResultId("androidtc-en-v606-1234")
.setActionIndices(1, 2, 5)
.setExtras(extra)
.setEventContext(new TextClassificationContext.Builder(
"pkg", TextClassifier.WIDGET_TYPE_TEXTVIEW)
.setWidgetVersion(TextView.class.getName())
.build())
.setScores(0.5f)
.setEntityTypes(TextClassifier.TYPE_ADDRESS, TextClassifier.TYPE_DATE)
.setLocale(ULocale.US)
.setModelName(MODEL_NAME)
.build();
}
private void assertFullConversationActionsEvent(
TextClassifierEvent.ConversationActionsEvent event) {
assertThat(event.getEventCategory()).isEqualTo(
TextClassifierEvent.CATEGORY_CONVERSATION_ACTIONS);
assertThat(event.getEventType()).isEqualTo(TextClassifierEvent.TYPE_ACTIONS_SHOWN);
assertThat(event.getEventIndex()).isEqualTo(2);
assertThat(event.getEntityTypes()).asList()
.containsExactly(TextClassifier.TYPE_ADDRESS, TextClassifier.TYPE_DATE);
assertThat(event.getResultId()).isEqualTo("androidtc-en-v606-1234");
assertThat(event.getActionIndices()).asList().containsExactly(1, 2, 5);
assertThat(event.getExtras().get("key")).isEqualTo("value");
assertThat(event.getEventContext().getPackageName()).isEqualTo("pkg");
assertThat(event.getEventContext().getWidgetType())
.isEqualTo(TextClassifier.WIDGET_TYPE_TEXTVIEW);
assertThat(event.getEventContext().getWidgetVersion()).isEqualTo(TextView.class.getName());
assertThat(event.getScores()).hasLength(1);
assertThat(event.getScores()[0]).isWithin(TOLERANCE).of(0.5f);
assertThat(event.getLocale()).isEqualTo(ULocale.US);
assertThat(event.getModelName()).isEqualTo(MODEL_NAME);
}
private TextClassifierEvent.LanguageDetectionEvent createMinimalLanguageDetectionEvent() {
return new TextClassifierEvent.LanguageDetectionEvent.Builder(
TextClassifierEvent.TYPE_SMART_ACTION)
.build();
}
private void assertMinimalLanguageDetectionEvent(
TextClassifierEvent.LanguageDetectionEvent event) {
assertThat(event.getEventCategory()).isEqualTo(
TextClassifierEvent.CATEGORY_LANGUAGE_DETECTION);
assertThat(event.getEventType()).isEqualTo(TextClassifierEvent.TYPE_SMART_ACTION);
assertThat(event.getEventIndex()).isEqualTo(0);
assertThat(event.getEntityTypes()).isEmpty();
assertThat(event.getResultId()).isNull();
assertThat(event.getActionIndices()).isEmpty();
assertThat(event.getExtras().size()).isEqualTo(0);
assertThat(event.getEventContext()).isNull();
assertThat(event.getEntityTypes()).isEmpty();
assertThat(event.getLocale()).isNull();
assertThat(event.getModelName()).isNull();
}
private TextClassifierEvent.LanguageDetectionEvent createFullLanguageDetectionEvent() {
final Bundle extra = new Bundle();
extra.putString("key", "value");
return new TextClassifierEvent.LanguageDetectionEvent.Builder(
TextClassifierEvent.TYPE_ACTIONS_SHOWN)
.setEventIndex(2)
.setEntityTypes(TextClassifier.TYPE_ADDRESS)
.setResultId("androidtc-en-v606-1234")
.setActionIndices(1, 2, 5)
.setExtras(extra)
.setEventContext(new TextClassificationContext.Builder(
"pkg", TextClassifier.WIDGET_TYPE_TEXTVIEW)
.setWidgetVersion(TextView.class.getName())
.build())
.setScores(0.5f)
.setEntityTypes(TextClassifier.TYPE_ADDRESS, TextClassifier.TYPE_DATE)
.setLocale(ULocale.US)
.setModelName(MODEL_NAME)
.build();
}
private void assertFullLanguageDetectionEvent(
TextClassifierEvent.LanguageDetectionEvent event) {
assertThat(event.getEventCategory()).isEqualTo(
TextClassifierEvent.CATEGORY_LANGUAGE_DETECTION);
assertThat(event.getEventType()).isEqualTo(TextClassifierEvent.TYPE_ACTIONS_SHOWN);
assertThat(event.getEventIndex()).isEqualTo(2);
assertThat(event.getEntityTypes()).asList()
.containsExactly(TextClassifier.TYPE_ADDRESS, TextClassifier.TYPE_DATE);
assertThat(event.getResultId()).isEqualTo("androidtc-en-v606-1234");
assertThat(event.getActionIndices()).asList().containsExactly(1, 2, 5);
assertThat(event.getLocale()).isEqualTo(ULocale.US);
assertThat(event.getModelName()).isEqualTo(MODEL_NAME);
assertThat(event.getExtras().get("key")).isEqualTo("value");
assertThat(event.getEventContext().getPackageName()).isEqualTo("pkg");
assertThat(event.getEventContext().getWidgetType())
.isEqualTo(TextClassifier.WIDGET_TYPE_TEXTVIEW);
assertThat(event.getEventContext().getWidgetVersion()).isEqualTo(TextView.class.getName());
assertThat(event.getScores()).hasLength(1);
assertThat(event.getScores()[0]).isWithin(TOLERANCE).of(0.5f);
}
private <T extends Parcelable> T parcelizeDeparcelize(
T parcelable, Parcelable.Creator<T> creator) {
Parcel parcel = Parcel.obtain();
parcelable.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
return creator.createFromParcel(parcel);
}
}