Files
Lawnchair/tests/src/com/android/launcher3/model/WorkspaceItemSpaceFinderTest.kt
T
Thales Lima 03ac377a34 Check kotlin format before uploading
This uses ktfmt on the PREUPLOAD hook to check file formatting.

Bug: 264851618
Test: manual
Change-Id: I8bdeabd9c1ed571a464707e6912419ad3190a169
Merged-In: I8bdeabd9c1ed571a464707e6912419ad3190a169
2023-01-10 13:24:43 +00:00

180 lines
5.8 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)
}
}