@ -5,8 +5,8 @@
package org.mozilla.fenix.tabstray
import android.content.res.Configuration
import android.util.DisplayMetrics
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.paging.Config
import com.google.android.material.bottomsheet.BottomSheetBehavior
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_COLLAPSED
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_DRAGGING
@ -15,11 +15,14 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_HALF_EX
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_HIDDEN
import com.google.android.material.bottomsheet.BottomSheetBehavior.STATE_SETTLING
import io.mockk.Called
import io.mockk.every
import io.mockk.mockk
import io.mockk.mockkStatic
import io.mockk.slot
import io.mockk.spyk
import io.mockk.unmockkStatic
import io.mockk.verify
import kotlinx.coroutines.currentCoroutineContext
import mozilla.components.support.ktx.android.util.dpToPx
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertSame
@ -69,7 +72,7 @@ class TabSheetBehaviorManagerTest {
val navigationInteractor : NavigationInteractor = mockk ( )
val callbackCaptor = slot < TraySheetBehaviorCallback > ( )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 2 , 2 , navigationInteractor )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 2 , 2 , navigationInteractor , mockk ( ) )
verify { behavior . addBottomSheetCallback ( capture ( callbackCaptor ) ) }
assertSame ( behavior , callbackCaptor . captured . behavior )
@ -78,13 +81,13 @@ class TabSheetBehaviorManagerTest {
@Test
fun `WHEN TabSheetBehaviorManager is initialized THEN it caches the orientation parameter value` ( ) {
val manager0 = TabSheetBehaviorManager ( mockk ( relaxed = true ) , Configuration . ORIENTATION _UNDEFINED , 5 , 4 , mockk ( ) )
val manager0 = TabSheetBehaviorManager ( mockk ( relaxed = true ) , Configuration . ORIENTATION _UNDEFINED , 5 , 4 , mockk ( ) , mockk ( ) )
assertEquals ( Configuration . ORIENTATION _UNDEFINED , manager0 . currentOrientation )
val manager1 = TabSheetBehaviorManager ( mockk ( relaxed = true ) , Configuration . ORIENTATION _PORTRAIT , 5 , 4 , mockk ( relaxed = true ) )
val manager1 = TabSheetBehaviorManager ( mockk ( relaxed = true ) , Configuration . ORIENTATION _PORTRAIT , 5 , 4 , mockk ( relaxed = true ) , mockk ( ) )
assertEquals ( Configuration . ORIENTATION _PORTRAIT , manager1 . currentOrientation )
val manager2 = TabSheetBehaviorManager ( mockk ( relaxed = true ) , Configuration . ORIENTATION _LANDSCAPE , 5 , 4 , mockk ( ) )
val manager2 = TabSheetBehaviorManager ( mockk ( relaxed = true ) , Configuration . ORIENTATION _LANDSCAPE , 5 , 4 , mockk ( ) , mockk ( ) )
assertEquals ( Configuration . ORIENTATION _LANDSCAPE , manager2 . currentOrientation )
}
@ -92,7 +95,7 @@ class TabSheetBehaviorManagerTest {
fun `GIVEN more tabs opened than the expanding limit and portrait orientation WHEN TabSheetBehaviorManager is initialized THEN the behavior is set as expanded` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _PORTRAIT , 5 , 4 , mockk ( ) )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _PORTRAIT , 5 , 4 , mockk ( ) , mockk ( ) )
assertEquals ( STATE _EXPANDED , behavior . state )
}
@ -101,7 +104,7 @@ class TabSheetBehaviorManagerTest {
fun `GIVEN the number of tabs opened is exactly the expanding limit and portrait orientation WHEN TabSheetBehaviorManager is initialized THEN the behavior is set as expanded` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _PORTRAIT , 5 , 5 , mockk ( ) )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _PORTRAIT , 5 , 5 , mockk ( ) , mockk ( ) )
assertEquals ( STATE _EXPANDED , behavior . state )
}
@ -110,7 +113,7 @@ class TabSheetBehaviorManagerTest {
fun `GIVEN fewer tabs opened than the expanding limit and portrait orientation WHEN TabSheetBehaviorManager is initialized THEN the behavior is set as collapsed` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _PORTRAIT , 4 , 5 , mockk ( ) )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _PORTRAIT , 4 , 5 , mockk ( ) , mockk ( ) )
assertEquals ( STATE _COLLAPSED , behavior . state )
}
@ -119,7 +122,7 @@ class TabSheetBehaviorManagerTest {
fun `GIVEN more tabs opened than the expanding limit and undefined orientation WHEN TabSheetBehaviorManager is initialized THEN the behavior is set as expanded` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 5 , 4 , mockk ( ) )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 5 , 4 , mockk ( ) , mockk ( ) )
assertEquals ( STATE _EXPANDED , behavior . state )
}
@ -128,7 +131,7 @@ class TabSheetBehaviorManagerTest {
fun `GIVEN the number of tabs opened is exactly the expanding limit and undefined orientation WHEN TabSheetBehaviorManager is initialized THEN the behavior is set as expanded` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 5 , 5 , mockk ( ) )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 5 , 5 , mockk ( ) , mockk ( ) )
assertEquals ( STATE _EXPANDED , behavior . state )
}
@ -137,7 +140,7 @@ class TabSheetBehaviorManagerTest {
fun `GIVEN fewer tabs opened than the expanding limit and undefined orientation WHEN TabSheetBehaviorManager is initialized THEN the behavior is set as collapsed` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 4 , 5 , mockk ( ) )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 4 , 5 , mockk ( ) , mockk ( ) )
assertEquals ( STATE _COLLAPSED , behavior . state )
}
@ -146,7 +149,7 @@ class TabSheetBehaviorManagerTest {
fun `GIVEN more tabs opened than the expanding limit and landscape orientation WHEN TabSheetBehaviorManager is initialized THEN the behavior is set as expanded` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _LANDSCAPE , 5 , 4 , mockk ( ) )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _LANDSCAPE , 5 , 4 , mockk ( ) , mockk ( ) )
assertEquals ( STATE _EXPANDED , behavior . state )
}
@ -155,7 +158,7 @@ class TabSheetBehaviorManagerTest {
fun `GIVEN the number of tabs opened is exactly the expanding limit and landscape orientation WHEN TabSheetBehaviorManager is initialized THEN the behavior is set as expanded` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _LANDSCAPE , 5 , 5 , mockk ( ) )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _LANDSCAPE , 5 , 5 , mockk ( ) , mockk ( ) )
assertEquals ( STATE _EXPANDED , behavior . state )
}
@ -164,7 +167,7 @@ class TabSheetBehaviorManagerTest {
fun `GIVEN fewer tabs opened than the expanding limit and landscape orientation WHEN TabSheetBehaviorManager is initialized THEN the behavior is set as expanded` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _LANDSCAPE , 4 , 5 , mockk ( ) )
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _LANDSCAPE , 4 , 5 , mockk ( ) , mockk ( ) )
assertEquals ( STATE _EXPANDED , behavior . state )
}
@ -172,7 +175,7 @@ class TabSheetBehaviorManagerTest {
@Test
fun `GIVEN more tabs opened than the expanding limit and not landscape orientation WHEN updateBehaviorState is called THEN the behavior is set as expanded` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
val manager = TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 5 , 4 , mockk ( ) )
val manager = TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 5 , 4 , mockk ( ) , mockk ( ) )
manager . updateBehaviorState ( false )
@ -182,7 +185,7 @@ class TabSheetBehaviorManagerTest {
@Test
fun `GIVEN the number of tabs opened is exactly the expanding limit and portrait orientation WHEN updateBehaviorState is called THEN the behavior is set as expanded` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
val manager = TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 5 , 5 , mockk ( ) )
val manager = TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 5 , 5 , mockk ( ) , mockk ( ) )
manager . updateBehaviorState ( false )
@ -192,7 +195,7 @@ class TabSheetBehaviorManagerTest {
@Test
fun `GIVEN fewer tabs opened than the expanding limit and portrait orientation WHEN updateBehaviorState is called THEN the behavior is set as collapsed` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
val manager = TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 4 , 5 , mockk ( ) )
val manager = TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 4 , 5 , mockk ( ) , mockk ( ) )
manager . updateBehaviorState ( false )
@ -202,7 +205,7 @@ class TabSheetBehaviorManagerTest {
@Test
fun `GIVEN more tabs opened than the expanding limit and landscape orientation WHEN updateBehaviorState is called THEN the behavior is set as expanded` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
val manager = TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 5 , 4 , mockk ( ) )
val manager = TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 5 , 4 , mockk ( ) , mockk ( ) )
manager . updateBehaviorState ( true )
@ -212,7 +215,7 @@ class TabSheetBehaviorManagerTest {
@Test
fun `GIVEN the number of tabs opened is exactly the expanding limit and landscape orientation WHEN updateBehaviorState is called THEN the behavior is set as expanded` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
val manager = TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 5 , 5 , mockk ( ) )
val manager = TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 5 , 5 , mockk ( ) , mockk ( ) )
manager . updateBehaviorState ( true )
@ -222,7 +225,7 @@ class TabSheetBehaviorManagerTest {
@Test
fun `GIVEN fewer tabs opened than the expanding limit and landscape orientation WHEN updateBehaviorState is called THEN the behavior is set as expanded` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
val manager = TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 4 , 5 , mockk ( ) )
val manager = TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 4 , 5 , mockk ( ) , mockk ( ) )
manager . updateBehaviorState ( true )
@ -231,45 +234,165 @@ class TabSheetBehaviorManagerTest {
@Test
fun `WHEN updateDependingOnOrientation is called with the same orientation as the current one THEN nothing happens` ( ) {
val manager = spyk ( TabSheetBehaviorManager ( mockk ( relaxed = true ) , Configuration . ORIENTATION _PORTRAIT , 4 , 5 , mockk ( ) ))
val manager = spyk ( TabSheetBehaviorManager ( mockk ( relaxed = true ) , Configuration . ORIENTATION _PORTRAIT , 4 , 5 , mockk ( ) , mockk ( ) ))
manager . updateDependingOnOrientation ( Configuration . ORIENTATION _PORTRAIT )
verify ( exactly = 0 ) { manager . currentOrientation = any ( ) }
verify ( exactly = 0 ) { manager . updateBehaviorExpandedOffset ( any ( ) ) }
verify ( exactly = 0 ) { manager . updateBehaviorState ( any ( ) ) }
}
@Test
fun `WHEN updateDependingOnOrientation is called with a new orientation THEN this is cached and updateBehaviorState is called` ( ) {
val manager = spyk ( TabSheetBehaviorManager ( mockk ( relaxed = true ) , Configuration . ORIENTATION _PORTRAIT , 4 , 5 , mockk ( ) ))
val manager = spyk ( TabSheetBehaviorManager ( mockk ( relaxed = true ) , Configuration . ORIENTATION _PORTRAIT , 4 , 5 , mockk ( ) , mockk ( ) ))
manager . updateDependingOnOrientation ( Configuration . ORIENTATION _UNDEFINED )
assertEquals ( Configuration . ORIENTATION _UNDEFINED , manager . currentOrientation )
verify { manager . updateBehaviorExpandedOffset ( any ( ) ) }
verify { manager . updateBehaviorState ( any ( ) ) }
manager . updateDependingOnOrientation ( Configuration . ORIENTATION _LANDSCAPE )
assertEquals ( Configuration . ORIENTATION _LANDSCAPE , manager . currentOrientation )
verify ( exactly = 2 ) { manager . updateBehaviorExpandedOffset ( any ( ) ) }
verify ( exactly = 2 ) { manager . updateBehaviorState ( any ( ) ) }
}
@Test
fun `WHEN isLandscape is called with Configuration#ORIENTATION_LANDSCAPE THEN it returns true` ( ) {
val manager = spyk ( TabSheetBehaviorManager ( mockk ( relaxed = true ) , Configuration . ORIENTATION _PORTRAIT , 4 , 5 , mockk ( ) ))
val manager = spyk ( TabSheetBehaviorManager ( mockk ( relaxed = true ) , Configuration . ORIENTATION _PORTRAIT , 4 , 5 , mockk ( ) , mockk ( ) ))
assertTrue ( manager . isLandscape ( Configuration . ORIENTATION _LANDSCAPE ) )
}
@Test
fun `WHEN isLandscape is called with Configuration#ORIENTATION_PORTRAIT THEN it returns false` ( ) {
val manager = spyk ( TabSheetBehaviorManager ( mockk ( relaxed = true ) , Configuration . ORIENTATION _PORTRAIT , 4 , 5 , mockk ( ) ))
val manager = spyk ( TabSheetBehaviorManager ( mockk ( relaxed = true ) , Configuration . ORIENTATION _PORTRAIT , 4 , 5 , mockk ( ) , mockk ( ) ))
assertFalse ( manager . isLandscape ( Configuration . ORIENTATION _PORTRAIT ) )
}
@Test
fun `WHEN isLandscape is called with Configuration#ORIENTATION_UNDEFINED THEN it returns false` ( ) {
val manager = spyk ( TabSheetBehaviorManager ( mockk ( relaxed = true ) , Configuration . ORIENTATION _PORTRAIT , 4 , 5 , mockk ( ) ))
val manager = spyk ( TabSheetBehaviorManager ( mockk ( relaxed = true ) , Configuration . ORIENTATION _PORTRAIT , 4 , 5 , mockk ( ) , mockk ( ) ))
assertFalse ( manager . isLandscape ( Configuration . ORIENTATION _UNDEFINED ) )
}
@Test
fun `GIVEN a behavior and landscape orientation WHEN TabSheetBehaviorManager is initialized THEN it sets the behavior expandedOffset to 0` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
// expandedOffset is only used if isFitToContents == false
behavior . isFitToContents = false
val displayMetrics : DisplayMetrics = mockk ( )
try {
mockkStatic ( " mozilla.components.support.ktx.android.util.DisplayMetricsKt " )
every { EXPANDED_OFFSET_IN_LANDSCAPE_DP . dpToPx ( displayMetrics ) } returns EXPANDED _OFFSET _IN _LANDSCAPE _DP
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _LANDSCAPE , 5 , 4 , mockk ( ) , displayMetrics )
} finally {
unmockkStatic ( " mozilla.components.support.ktx.android.util.DisplayMetricsKt " )
}
assertEquals ( 0 , behavior . expandedOffset )
}
@Test
fun `GIVEN a behavior and portrait orientation WHEN TabSheetBehaviorManager is initialized THEN it sets the behavior expandedOffset to 40` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
// expandedOffset is only used if isFitToContents == false
behavior . isFitToContents = false
val displayMetrics : DisplayMetrics = mockk ( )
try {
mockkStatic ( " mozilla.components.support.ktx.android.util.DisplayMetricsKt " )
every { EXPANDED_OFFSET_IN_PORTRAIT_DP . dpToPx ( displayMetrics ) } returns EXPANDED _OFFSET _IN _PORTRAIT _DP
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _PORTRAIT , 5 , 4 , mockk ( ) , displayMetrics )
} finally {
unmockkStatic ( " mozilla.components.support.ktx.android.util.DisplayMetricsKt " )
}
assertEquals ( 40 , behavior . expandedOffset )
}
@Test
fun `GIVEN a behavior and undefined orientation WHEN TabSheetBehaviorManager is initialized THEN it sets the behavior expandedOffset to 40` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
// expandedOffset is only used if isFitToContents == false
behavior . isFitToContents = false
val displayMetrics : DisplayMetrics = mockk ( )
try {
mockkStatic ( " mozilla.components.support.ktx.android.util.DisplayMetricsKt " )
every { EXPANDED_OFFSET_IN_PORTRAIT_DP . dpToPx ( displayMetrics ) } returns EXPANDED _OFFSET _IN _PORTRAIT _DP
TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 5 , 4 , mockk ( ) , displayMetrics )
} finally {
unmockkStatic ( " mozilla.components.support.ktx.android.util.DisplayMetricsKt " )
}
assertEquals ( 40 , behavior . expandedOffset )
}
@Test
fun `WHEN updateBehaviorExpandedOffset is called with a portrait parameter THEN it sets expandedOffset to be 40 dp` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
// expandedOffset is only used if isFitToContents == false
behavior . isFitToContents = false
val displayMetrics : DisplayMetrics = mockk ( )
try {
mockkStatic ( " mozilla.components.support.ktx.android.util.DisplayMetricsKt " )
every { EXPANDED_OFFSET_IN_PORTRAIT_DP . dpToPx ( displayMetrics ) } returns EXPANDED _OFFSET _IN _PORTRAIT _DP
val manager = TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _LANDSCAPE , 5 , 4 , mockk ( ) , displayMetrics )
manager . updateDependingOnOrientation ( Configuration . ORIENTATION _PORTRAIT )
} finally {
unmockkStatic ( " mozilla.components.support.ktx.android.util.DisplayMetricsKt " )
}
assertEquals ( 40 , behavior . expandedOffset )
}
@Test
fun `WHEN updateBehaviorExpandedOffset is called with a undefined parameter THEN it sets expandedOffset to be 40 dp` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
// expandedOffset is only used if isFitToContents == false
behavior . isFitToContents = false
val displayMetrics : DisplayMetrics = mockk ( )
try {
mockkStatic ( " mozilla.components.support.ktx.android.util.DisplayMetricsKt " )
every { EXPANDED_OFFSET_IN_PORTRAIT_DP . dpToPx ( displayMetrics ) } returns EXPANDED _OFFSET _IN _PORTRAIT _DP
val manager = TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _LANDSCAPE , 5 , 4 , mockk ( ) , displayMetrics )
manager . updateDependingOnOrientation ( Configuration . ORIENTATION _UNDEFINED )
} finally {
unmockkStatic ( " mozilla.components.support.ktx.android.util.DisplayMetricsKt " )
}
assertEquals ( 40 , behavior . expandedOffset )
}
@Test
fun `WHEN updateBehaviorExpandedOffset is called with a landscape parameter THEN it sets expandedOffset to be 0 dp` ( ) {
val behavior = BottomSheetBehavior < ConstraintLayout > ( )
// expandedOffset is only used if isFitToContents == false
behavior . isFitToContents = false
val displayMetrics : DisplayMetrics = mockk ( )
try {
mockkStatic ( " mozilla.components.support.ktx.android.util.DisplayMetricsKt " )
every { EXPANDED_OFFSET_IN_LANDSCAPE_DP . dpToPx ( displayMetrics ) } returns EXPANDED _OFFSET _IN _LANDSCAPE _DP
val manager = TabSheetBehaviorManager ( behavior , Configuration . ORIENTATION _UNDEFINED , 5 , 4 , mockk ( ) , displayMetrics )
manager . updateDependingOnOrientation ( Configuration . ORIENTATION _LANDSCAPE )
} finally {
unmockkStatic ( " mozilla.components.support.ktx.android.util.DisplayMetricsKt " )
}
assertEquals ( 0 , behavior . expandedOffset )
}
}