You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iceraven-browser/app/src/test/java/org/mozilla/fenix/sync/SyncedTabsTitleDecorationTe...

102 lines
3.5 KiB
Kotlin

/* 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.sync
import android.graphics.Canvas
import android.graphics.Rect
import android.graphics.drawable.Drawable
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import io.mockk.Called
import io.mockk.every
import io.mockk.mockk
import io.mockk.verify
import org.junit.Before
import org.junit.Test
import org.mozilla.fenix.sync.SyncedTabsTitleDecoration.Style
import org.mozilla.fenix.sync.SyncedTabsViewHolder.DeviceViewHolder
import org.mozilla.fenix.sync.SyncedTabsViewHolder.ErrorViewHolder
class SyncedTabsTitleDecorationTest {
private val recyclerView: RecyclerView = mockk(relaxed = true)
private val canvas: Canvas = mockk(relaxed = true)
private val viewHolder: RecyclerView.ViewHolder = mockk(relaxed = true)
private val state: RecyclerView.State = mockk(relaxed = true)
private val view: View = mockk(relaxed = true)
// Mocking these classes so we don't have to use the (slow) Android test runner.
private val rect: Rect = mockk(relaxed = true)
private val colorDrawable: Drawable = mockk(relaxed = true)
private val style = Style(5, colorDrawable)
@Before
fun setup() {
every { recyclerView.getChildViewHolder(any()) }.returns(viewHolder)
every { recyclerView.childCount }.returns(1)
every { recyclerView.getChildAt(any()) }.returns(view)
every { view.left }.returns(5)
every { view.top }.returns(5)
every { view.right }.returns(5)
every { view.bottom }.returns(5)
}
@Test
fun `WHEN device title and not first item THEN add offset to the layout rect`() {
val decoration = SyncedTabsTitleDecoration(mockk(), style)
every { viewHolder.itemViewType }.answers { DeviceViewHolder.LAYOUT_ID }
every { viewHolder.bindingAdapterPosition }.answers { 1 }
decoration.getItemOffsets(rect, mockk(), recyclerView, state)
verify { rect.set(0, 5, 0, 0) }
}
@Test
fun `WHEN not device title and first position THEN do not add offsets`() {
val decoration = SyncedTabsTitleDecoration(mockk(), style)
every { viewHolder.itemViewType }.answers { ErrorViewHolder.LAYOUT_ID }
every { viewHolder.bindingAdapterPosition }
.answers { 1 }
.andThenAnswer { 0 }
decoration.getItemOffsets(rect, mockk(), recyclerView, state)
decoration.getItemOffsets(rect, mockk(), recyclerView, state)
verify(exactly = 2) { rect.setEmpty() }
}
@Test
fun `WHEN device title and not first THEN draw`() {
val decoration = SyncedTabsTitleDecoration(mockk(), style)
every { viewHolder.itemViewType }.answers { DeviceViewHolder.LAYOUT_ID }
every { viewHolder.bindingAdapterPosition }.answers { 1 }
decoration.onDraw(canvas, recyclerView, state)
verify { colorDrawable.setBounds(5, 0, 5, 5) }
verify { colorDrawable.draw(canvas) }
}
@Test
fun `WHEN not device title and not first THEN do not draw`() {
val decoration = SyncedTabsTitleDecoration(mockk(), style)
every { viewHolder.itemViewType }.answers { ErrorViewHolder.LAYOUT_ID }
every { viewHolder.bindingAdapterPosition }
.answers { 1 }
.andThenAnswer { 0 }
decoration.onDraw(canvas, recyclerView, state)
verify { colorDrawable wasNot Called }
}
}