package com.android.systemui.statusbar

import android.media.AudioAttributes
import android.os.UserHandle
import android.os.VibrationAttributes
import android.os.VibrationEffect
import android.os.Vibrator
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.util.mockito.eq
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentCaptor
import org.mockito.Captor
import org.mockito.Mock
import org.mockito.Mockito.`when` as whenever
import org.mockito.Mockito.any
import org.mockito.Mockito.mock
import org.mockito.Mockito.verify
import org.mockito.junit.MockitoJUnit
import java.util.concurrent.Executor

@RunWith(AndroidTestingRunner::class)
@SmallTest
class VibratorHelperTest : SysuiTestCase() {

    @JvmField @Rule
    var rule = MockitoJUnit.rule()

    @Mock lateinit var vibrator: Vibrator
    @Mock lateinit var executor: Executor
    @Captor lateinit var backgroundTaskCaptor: ArgumentCaptor<Runnable>
    lateinit var vibratorHelper: VibratorHelper

    @Before
    fun setup() {
        vibratorHelper = VibratorHelper(vibrator, executor)
        whenever(vibrator.hasVibrator()).thenReturn(true)
    }

    @Test
    fun testVibrate() {
        vibratorHelper.vibrate(VibrationEffect.EFFECT_CLICK)
        verifyAsync().vibrate(any(VibrationEffect::class.java),
                any(VibrationAttributes::class.java))
    }

    @Test
    fun testVibrate2() {
        vibratorHelper.vibrate(UserHandle.USER_CURRENT, "package",
                mock(VibrationEffect::class.java), "reason",
                mock(VibrationAttributes::class.java))
        verifyAsync().vibrate(eq(UserHandle.USER_CURRENT), eq("package"),
                any(VibrationEffect::class.java), eq("reason"),
                any(VibrationAttributes::class.java))
    }

    @Test
    fun testVibrate3() {
        vibratorHelper.vibrate(mock(VibrationEffect::class.java), mock(AudioAttributes::class.java))
        verifyAsync().vibrate(any(VibrationEffect::class.java), any(AudioAttributes::class.java))
    }

    @Test
    fun testVibrate4() {
        vibratorHelper.vibrate(mock(VibrationEffect::class.java))
        verifyAsync().vibrate(any(VibrationEffect::class.java))
    }

    @Test
    fun testHasVibrator() {
        assertThat(vibratorHelper.hasVibrator()).isTrue()
        verify(vibrator).hasVibrator()
    }

    @Test
    fun testCancel() {
        vibratorHelper.cancel()
        verifyAsync().cancel()
    }

    private fun verifyAsync(): Vibrator {
        verify(executor).execute(backgroundTaskCaptor.capture())
        verify(vibrator).hasVibrator()
        backgroundTaskCaptor.value.run()

        return verify(vibrator)
    }
}