Files
lawnchair/tests/src/com/android/launcher3/model/WorkspaceItemSpaceFinderTest.kt
Andras Kloczl 68e1af2bc2 Separate workspace item finding logic
Extract the item finding logic from AddWorkspaceItemsTask
to a separate class and write tests.

Test: AddWorkspaceItemsTaskTest.kt , WorkspaceItemSpaceFinderTest.kt
Bug: 199160559
Change-Id: Ie1bc4fcd4f94cd7cb0601c21bbdf273452b9dd1f
2022-03-29 13:31:31 +01:00

172 lines
5.6 KiB
Kotlin

/*
* Copyright (C) 2022 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.model
import android.graphics.Rect
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.google.common.truth.Truth.assertThat
import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
/**
* Tests for [WorkspaceItemSpaceFinder]
*/
@SmallTest
@RunWith(AndroidJUnit4::class)
class WorkspaceItemSpaceFinderTest : AbstractWorkspaceModelTest() {
private val mItemSpaceFinder = WorkspaceItemSpaceFinder()
@Before
override fun setup() {
super.setup()
}
@After
override fun tearDown() {
super.tearDown()
}
private fun findSpace(spanX: Int, spanY: Int): NewItemSpace =
mItemSpaceFinder.findSpaceForItem(
mAppState, mModelHelper.bgDataModel,
mExistingScreens, mNewScreens, spanX, spanY
)
.let { NewItemSpace.fromIntArray(it) }
private fun assertRegionVacant(newItemSpace: NewItemSpace, spanX: Int, spanY: Int) {
assertThat(
mScreenOccupancy[newItemSpace.screenId]
.isRegionVacant(newItemSpace.cellX, newItemSpace.cellY, spanX, spanY)
).isTrue()
}
@Test
fun justEnoughSpaceOnFirstScreen_whenFindSpaceForItem_thenReturnFirstScreenId() {
setupWorkspacesWithSpaces(
// 3x2 space on screen 0, but it should be skipped
screen0 = listOf(Rect(2, 0, 5, 2)),
screen1 = listOf(Rect(2, 2, 3, 3)), // 1x1 space
// 2 spaces of sizes 3x2 and 2x3
screen2 = listOf(Rect(2, 0, 5, 2), Rect(0, 2, 2, 5)),
)
val spaceFound = findSpace(1, 1)
assertThat(spaceFound.screenId).isEqualTo(1)
assertRegionVacant(spaceFound, 1, 1)
}
@Test
fun notEnoughSpaceOnFirstScreen_whenFindSpaceForItem_thenReturnSecondScreenId() {
setupWorkspacesWithSpaces(
// 3x2 space on screen 0, but it should be skipped
screen0 = listOf(Rect(2, 0, 5, 2)),
screen1 = listOf(Rect(2, 2, 3, 3)), // 1x1 space
// 2 spaces of sizes 3x2 and 2x3
screen2 = listOf(Rect(2, 0, 5, 2), Rect(0, 2, 2, 5)),
)
// Find a larger space
val spaceFound = findSpace(2, 3)
assertThat(spaceFound.screenId).isEqualTo(2)
assertRegionVacant(spaceFound, 2, 3)
}
@Test
fun notEnoughSpaceOnExistingScreens_returnNewScreenId() {
setupWorkspacesWithSpaces(
// 3x2 space on screen 0, but it should be skipped
screen0 = listOf(Rect(2, 0, 5, 2)),
// 2 spaces of sizes 3x2 and 2x3
screen1 = listOf(Rect(2, 0, 5, 2), Rect(0, 2, 2, 5)),
// 2 spaces of sizes 1x2 and 2x2
screen2 = listOf(Rect(1, 0, 2, 2), Rect(3, 2, 5, 4)),
)
val oldScreens = mExistingScreens.clone()
val spaceFound = findSpace(3, 3)
assertThat(oldScreens.contains(spaceFound.screenId)).isFalse()
assertThat(mNewScreens.contains(spaceFound.screenId)).isTrue()
}
@Test
fun firstScreenIsEmptyButSecondIsNotEmpty_returnSecondScreenId() {
setupWorkspacesWithSpaces(
// 3x2 space on screen 0, but it should be skipped
screen0 = listOf(Rect(2, 0, 5, 2)),
// empty screens are skipped
screen2 = listOf(Rect(2, 0, 5, 2)), // 3x2 space
)
val spaceFound = findSpace(2, 1)
assertThat(spaceFound.screenId).isEqualTo(2)
assertRegionVacant(spaceFound, 2, 1)
}
@Test
fun twoEmptyMiddleScreens_returnThirdScreen() {
setupWorkspacesWithSpaces(
// 3x2 space on screen 0, but it should be skipped
screen0 = listOf(Rect(2, 0, 5, 2)),
// empty screens are skipped
screen3 = listOf(Rect(1, 1, 4, 4)), // 3x3 space
)
val spaceFound = findSpace(2, 3)
assertThat(spaceFound.screenId).isEqualTo(3)
assertRegionVacant(spaceFound, 2, 3)
}
@Test
fun allExistingPagesAreFull_returnNewScreenId() {
setupWorkspacesWithSpaces(
// 3x2 space on screen 0, but it should be skipped
screen0 = listOf(Rect(2, 0, 5, 2)),
screen1 = fullScreenSpaces,
screen2 = fullScreenSpaces,
)
val spaceFound = findSpace(2, 3)
assertThat(spaceFound.screenId).isEqualTo(3)
assertThat(mNewScreens.contains(spaceFound.screenId)).isTrue()
}
@Test
fun firstTwoPagesAreFull_and_ThirdPageIsEmpty_returnThirdPage() {
setupWorkspacesWithSpaces(
// 3x2 space on screen 0, but it should be skipped
screen0 = listOf(Rect(2, 0, 5, 2)),
screen1 = fullScreenSpaces, // full screens are skipped
screen2 = fullScreenSpaces, // full screens are skipped
screen3 = emptyScreenSpaces
)
val spaceFound = findSpace(3, 1)
assertThat(spaceFound.screenId).isEqualTo(3)
assertRegionVacant(spaceFound, 3, 1)
}
}