mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-03-02 17:06:49 +00:00
Extract the item finding logic from AddWorkspaceItemsTask to a separate class and write tests. Test: AddWorkspaceItemsTaskTest.kt , WorkspaceItemSpaceFinderTest.kt Bug: 199160559 Change-Id: Ie1bc4fcd4f94cd7cb0601c21bbdf273452b9dd1f
172 lines
5.6 KiB
Kotlin
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)
|
|
}
|
|
}
|