[Test week] unit tests for ItemInfoMatcher
7 public methods tested
no previous test class
Flag: TEST_ONLY
Bug: 353303621
Test: unit tests
Change-Id: Ie327ab790b46326ee97165706c126c8ad0de7776
diff --git a/tests/multivalentTests/src/com/android/launcher3/util/ItemInfoMatcherTest.kt b/tests/multivalentTests/src/com/android/launcher3/util/ItemInfoMatcherTest.kt
new file mode 100644
index 0000000..daba024
--- /dev/null
+++ b/tests/multivalentTests/src/com/android/launcher3/util/ItemInfoMatcherTest.kt
@@ -0,0 +1,213 @@
+/*
+ * Copyright (C) 2024 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 com.android.launcher3.util
+
+import android.content.ComponentName
+import android.content.Intent
+import android.os.UserHandle
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT
+import com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_FOLDER
+import com.android.launcher3.model.data.FolderInfo
+import com.android.launcher3.model.data.ItemInfo
+import com.android.launcher3.shortcuts.ShortcutKey
+import com.android.launcher3.util.ItemInfoMatcher.ofShortcutKeys
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.spy
+import org.mockito.kotlin.whenever
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class ItemInfoMatcherTest {
+
+ @Test
+ fun `ofUser returns Predicate for ItemInfo containing given UserHandle`() {
+ val expectedItemInfo = ItemInfo().apply { user = UserHandle(11) }
+ val unexpectedItemInfo = ItemInfo().apply { user = UserHandle(0) }
+ val itemInfoStream = listOf(expectedItemInfo, unexpectedItemInfo).stream()
+
+ val predicate = ItemInfoMatcher.ofUser(UserHandle(11))
+ val actualResults = itemInfoStream.filter(predicate).toList()
+
+ assertThat(actualResults).containsExactly(expectedItemInfo)
+ }
+
+ @Test
+ fun `ofComponents returns Predicate for ItemInfo containing target Component and UserHandle`() {
+ // Given
+ val expectedUserHandle = UserHandle(0)
+ val expectedComponentName = ComponentName("expectedPackage", "expectedClass")
+ val expectedItemInfo = spy(ItemInfo())
+ expectedItemInfo.user = expectedUserHandle
+ whenever(expectedItemInfo.targetComponent).thenReturn(expectedComponentName)
+
+ val unexpectedComponentName = ComponentName("unexpectedPackage", "unexpectedClass")
+ val unexpectedItemInfo1 = spy(ItemInfo())
+ unexpectedItemInfo1.user = expectedUserHandle
+ whenever(unexpectedItemInfo1.targetComponent).thenReturn(unexpectedComponentName)
+
+ val unexpectedItemInfo2 = spy(ItemInfo())
+ unexpectedItemInfo2.user = UserHandle(10)
+ whenever(unexpectedItemInfo2.targetComponent).thenReturn(expectedComponentName)
+
+ val itemInfoStream =
+ listOf(expectedItemInfo, unexpectedItemInfo1, unexpectedItemInfo2).stream()
+
+ // When
+ val predicate =
+ ItemInfoMatcher.ofComponents(hashSetOf(expectedComponentName), expectedUserHandle)
+ val actualResults = itemInfoStream.filter(predicate).toList()
+
+ // Then
+ assertThat(actualResults).containsExactly(expectedItemInfo)
+ }
+
+ @Test
+ fun `ofPackages returns Predicate for ItemInfo containing UserHandle and target package`() {
+ // Given
+ val expectedUserHandle = UserHandle(0)
+ val expectedPackage = "expectedPackage"
+ val expectedComponentName = ComponentName(expectedPackage, "expectedClass")
+ val expectedItemInfo = spy(ItemInfo())
+ expectedItemInfo.user = expectedUserHandle
+ whenever(expectedItemInfo.targetComponent).thenReturn(expectedComponentName)
+
+ val unexpectedPackage = "unexpectedPackage"
+ val unexpectedComponentName = ComponentName(unexpectedPackage, "unexpectedClass")
+ val unexpectedItemInfo1 = spy(ItemInfo())
+ unexpectedItemInfo1.user = expectedUserHandle
+ whenever(unexpectedItemInfo1.targetComponent).thenReturn(unexpectedComponentName)
+
+ val unexpectedItemInfo2 = spy(ItemInfo())
+ unexpectedItemInfo2.user = UserHandle(10)
+ whenever(unexpectedItemInfo2.targetComponent).thenReturn(expectedComponentName)
+
+ val itemInfoStream =
+ listOf(expectedItemInfo, unexpectedItemInfo1, unexpectedItemInfo2).stream()
+
+ // When
+ val predicate = ItemInfoMatcher.ofPackages(setOf(expectedPackage), expectedUserHandle)
+ val actualResults = itemInfoStream.filter(predicate).toList()
+
+ // Then
+ assertThat(actualResults).containsExactly(expectedItemInfo)
+ }
+
+ @Test
+ fun `ofShortcutKeys returns Predicate for Deep Shortcut Info containing given ShortcutKey`() {
+ // Given
+ val expectedItemInfo = spy(ItemInfo())
+ expectedItemInfo.itemType = ITEM_TYPE_DEEP_SHORTCUT
+ val expectedIntent =
+ Intent().apply {
+ putExtra("shortcut_id", "expectedShortcut")
+ `package` = "expectedPackage"
+ }
+ whenever(expectedItemInfo.intent).thenReturn(expectedIntent)
+
+ val unexpectedIntent =
+ Intent().apply {
+ putExtra("shortcut_id", "unexpectedShortcut")
+ `package` = "unexpectedPackage"
+ }
+ val unexpectedItemInfo = spy(ItemInfo())
+ unexpectedItemInfo.itemType = ITEM_TYPE_DEEP_SHORTCUT
+ whenever(unexpectedItemInfo.intent).thenReturn(unexpectedIntent)
+
+ val itemInfoStream = listOf(expectedItemInfo, unexpectedItemInfo).stream()
+ val expectedShortcutKey = ShortcutKey.fromItemInfo(expectedItemInfo)
+
+ // When
+ val predicate = ItemInfoMatcher.ofShortcutKeys(setOf(expectedShortcutKey))
+ val actualResults = itemInfoStream.filter(predicate).toList()
+
+ // Then
+ assertThat(actualResults).containsExactly(expectedItemInfo)
+ }
+
+ @Test
+ fun `forFolderMatch returns Predicate to match against children within Folder ItemInfo`() {
+ // Given
+ val expectedItemInfo = spy(FolderInfo())
+ expectedItemInfo.itemType = ITEM_TYPE_FOLDER
+ val expectedIntent =
+ Intent().apply {
+ putExtra("shortcut_id", "expectedShortcut")
+ `package` = "expectedPackage"
+ }
+ val expectedChildInfo = spy(ItemInfo())
+ expectedChildInfo.itemType = ITEM_TYPE_DEEP_SHORTCUT
+ whenever(expectedChildInfo.intent).thenReturn(expectedIntent)
+ whenever(expectedItemInfo.getContents()).thenReturn(arrayListOf(expectedChildInfo))
+
+ val unexpectedItemInfo = spy(FolderInfo())
+ unexpectedItemInfo.itemType = ITEM_TYPE_FOLDER
+
+ val itemInfoStream = listOf(expectedItemInfo, unexpectedItemInfo).stream()
+ val expectedShortcutKey = ShortcutKey.fromItemInfo(expectedChildInfo)
+
+ // When
+ val predicate = ItemInfoMatcher.forFolderMatch(ofShortcutKeys(setOf(expectedShortcutKey)))
+ val actualResults = itemInfoStream.filter(predicate).toList()
+
+ // Then
+ assertThat(actualResults).containsExactly(expectedItemInfo)
+ }
+
+ @Test
+ fun `ofItemIds returns Predicate to match ItemInfo that contains given ids`() {
+ // Given
+ val expectedItemInfo = spy(ItemInfo())
+ expectedItemInfo.id = 1
+
+ val unexpectedItemInfo = spy(ItemInfo())
+ unexpectedItemInfo.id = 2
+
+ val itemInfoStream = listOf(expectedItemInfo, unexpectedItemInfo).stream()
+
+ // When
+ val expectedIds = IntSet().apply { add(1) }
+ val predicate = ItemInfoMatcher.ofItemIds(expectedIds)
+ val actualResults = itemInfoStream.filter(predicate).toList()
+
+ // Then
+ assertThat(actualResults).containsExactly(expectedItemInfo)
+ }
+
+ @Test
+ fun `ofItems returns Predicate matching against provided ItemInfo`() {
+ // Given
+ val expectedItemInfo = spy(ItemInfo())
+ expectedItemInfo.id = 1
+
+ val unexpectedItemInfo = spy(ItemInfo())
+ unexpectedItemInfo.id = 2
+
+ val itemInfoStream = listOf(expectedItemInfo, unexpectedItemInfo).stream()
+
+ // When
+ val expectedItems = setOf(expectedItemInfo)
+ val predicate = ItemInfoMatcher.ofItems(expectedItems)
+ val actualResults = itemInfoStream.filter(predicate).toList()
+
+ // Then
+ assertThat(actualResults).containsExactly(expectedItemInfo)
+ }
+}