1
0
Fork 0
fenix/app/src/test/java/org/mozilla/fenix/ext/ViewTest.kt

170 lines
5.9 KiB
Kotlin
Raw Normal View History

2020-06-10 18:14:18 +02:00
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.ext
import android.graphics.Rect
import android.os.Build
2020-06-10 18:14:18 +02:00
import android.util.DisplayMetrics
import android.view.View
import android.view.WindowInsets
2020-06-10 18:14:18 +02:00
import android.widget.FrameLayout
import androidx.core.view.WindowInsetsCompat
2020-06-10 18:14:18 +02:00
import io.mockk.MockKAnnotations
import io.mockk.Runs
import io.mockk.every
import io.mockk.impl.annotations.MockK
import io.mockk.just
import io.mockk.mockk
2020-06-10 18:14:18 +02:00
import io.mockk.mockkStatic
import io.mockk.slot
import io.mockk.verify
import mozilla.components.support.ktx.android.util.dpToPx
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mozilla.fenix.helpers.FenixRobolectricTestRunner
import org.robolectric.annotation.Config
2020-06-10 18:14:18 +02:00
@RunWith(FenixRobolectricTestRunner::class)
2020-06-10 18:14:18 +02:00
class ViewTest {
@MockK private lateinit var view: View
@MockK private lateinit var parent: FrameLayout
@MockK private lateinit var displayMetrics: DisplayMetrics
@Before
fun setup() {
MockKAnnotations.init(this)
mockkStatic("mozilla.components.support.ktx.android.util.DisplayMetricsKt")
mockkStatic("org.mozilla.fenix.ext.ViewKt")
2020-06-10 18:14:18 +02:00
every { view.resources.displayMetrics } returns displayMetrics
every { view.parent } returns parent
every { parent.touchDelegate = any() } just Runs
every { parent.post(any()) } answers {
// Immediately run the given Runnable argument
val action: Runnable = firstArg()
action.run()
true
}
}
@Test
fun `test increase touch area`() {
val hitRect = Rect(30, 40, 50, 60)
val dp = 10
val px = 20
val outRect = slot<Rect>()
every { dp.dpToPx(displayMetrics) } returns px
every { view.getHitRect(capture(outRect)) } answers { outRect.captured.set(hitRect) }
view.increaseTapArea(dp)
val expected = Rect(10, 20, 70, 80)
assertEquals(expected.left, outRect.captured.left)
assertEquals(expected.top, outRect.captured.top)
assertEquals(expected.right, outRect.captured.right)
assertEquals(expected.bottom, outRect.captured.bottom)
verify { parent.touchDelegate = any() }
}
@Test
fun `test remove touch delegate`() {
view.removeTouchDelegate()
verify { parent.touchDelegate = null }
}
@Config(sdk = [Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.LOLLIPOP_MR1])
@Test
fun `getWindowInsets returns null below API 23`() {
assertEquals(null, view.getWindowInsets())
}
@Test
fun `getWindowInsets returns null when the system insets don't exist`() {
every { view.rootWindowInsets } returns null
assertEquals(null, view.getWindowInsets())
}
@Test
fun `getWindowInsets returns the compat insets when the system insets exist`() {
val rootInsets: WindowInsets = mockk(relaxed = true)
every { view.rootWindowInsets } returns rootInsets
assertEquals(WindowInsetsCompat.toWindowInsetsCompat(rootInsets), view.getWindowInsets())
}
@Config(sdk = [Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.LOLLIPOP_MR1])
@Test
fun `getKeyboardHeight accounts for status bar below API 23`() {
every { view.getWindowVisibleDisplayFrame() } returns Rect(0, 50, 1000, 500)
every { view.rootView.height } returns 1000
assertEquals(500, view.getKeyboardHeight())
}
@Test
fun `getKeyboardHeight accounts for status bar and navigation bar`() {
every { view.getWindowVisibleDisplayFrame() } returns Rect(0, 50, 1000, 500)
every { view.rootView.height } returns 1000
every { view.getWindowInsets() } returns mockk(relaxed = true) {
every { stableInsetBottom } returns 50
}
assertEquals(450, view.getKeyboardHeight())
}
@Config(sdk = [Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.LOLLIPOP_MR1])
@Test
fun `isKeyboardVisible returns false when the keyboard height is less than or equal to the minimum threshold`() {
val threshold = MINIMUM_KEYBOARD_HEIGHT.dpToPx(displayMetrics)
every { view.getKeyboardHeight() } returns threshold - 1
assertEquals(false, view.isKeyboardVisible())
every { view.getKeyboardHeight() } returns threshold
assertEquals(false, view.isKeyboardVisible())
}
@Config(sdk = [Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.LOLLIPOP_MR1])
@Test
fun `isKeyboardVisible returns true when the keyboard height is greater than the minimum threshold`() {
val threshold = MINIMUM_KEYBOARD_HEIGHT.dpToPx(displayMetrics)
every { view.getKeyboardHeight() } returns threshold + 1
assertEquals(true, view.isKeyboardVisible())
}
@Test
fun `isKeyboardVisible returns false when the keyboard height is 0`() {
every { view.getKeyboardHeight() } returns 0
assertEquals(false, view.isKeyboardVisible())
}
@Test
fun `isKeyboardVisible returns true when the keyboard height is greater than 0`() {
every { view.getKeyboardHeight() } returns 100
assertEquals(true, view.isKeyboardVisible())
}
@Test
fun `getRectWithScreenLocation should transform getLocationInScreen method values`() {
val locationOnScreen = slot<IntArray>()
every { view.getLocationOnScreen(capture(locationOnScreen)) } answers {
locationOnScreen.captured[0] = 100
locationOnScreen.captured[1] = 200
}
every { view.width } returns 150
every { view.height } returns 250
val outRect = view.getRectWithScreenLocation()
assertEquals(100, outRect.left)
assertEquals(200, outRect.top)
assertEquals(250, outRect.right)
assertEquals(450, outRect.bottom)
}
2020-06-10 18:14:18 +02:00
}