@@ -11,6 +11,7 @@ import android.hardware.camera2.CameraManager
11
11
import android.media.Image
12
12
import android.util.Size
13
13
import android.view.View
14
+ import android.widget.TextView
14
15
import androidx.fragment.app.FragmentActivity
15
16
import androidx.test.ext.junit.runners.AndroidJUnit4
16
17
import com.google.zxing.BarcodeFormat
@@ -32,6 +33,7 @@ import org.junit.Assert.assertSame
32
33
import org.junit.Assert.fail
33
34
import org.junit.Test
34
35
import org.junit.runner.RunWith
36
+ import org.mockito.ArgumentMatchers.anyBoolean
35
37
import org.mockito.ArgumentMatchers.anyInt
36
38
import org.mockito.ArgumentMatchers.anyString
37
39
import org.mockito.Mockito.`when`
@@ -68,14 +70,16 @@ class QrFragmentTest {
68
70
whenever(qrFragment.setUpCameraOutputs(anyInt(), anyInt())).then { }
69
71
70
72
qrFragment.textureView = mock()
73
+ qrFragment.cameraErrorView = mock()
74
+ qrFragment.customViewFinder = mock()
71
75
qrFragment.onResume()
72
- verify(qrFragment, never()).openCamera (anyInt(), anyInt())
76
+ verify(qrFragment, never()).tryOpenCamera (anyInt(), anyInt(), anyBoolean ())
73
77
74
78
whenever(qrFragment.textureView.isAvailable).thenReturn(true )
75
79
qrFragment.cameraId = " mockCamera"
76
80
qrFragment.onResume()
77
81
verify(qrFragment, times(2 )).startBackgroundThread()
78
- verify(qrFragment).openCamera (anyInt(), anyInt())
82
+ verify(qrFragment).tryOpenCamera (anyInt(), anyInt(), anyBoolean ())
79
83
}
80
84
81
85
@Test
@@ -84,9 +88,11 @@ class QrFragmentTest {
84
88
val view: View = mock()
85
89
val textureView: AutoFitTextureView = mock()
86
90
val viewFinder: CustomViewFinder = mock()
91
+ val cameraErrorView: TextView = mock()
87
92
88
93
whenever(view.findViewById<AutoFitTextureView >(R .id.texture)).thenReturn(textureView)
89
94
whenever(view.findViewById<CustomViewFinder >(R .id.view_finder)).thenReturn(viewFinder)
95
+ whenever(view.findViewById<TextView >(R .id.camera_error)).thenReturn(cameraErrorView)
90
96
91
97
qrFragment.onViewCreated(view, mock())
92
98
assertEquals(QrFragment .STATE_FIND_QRCODE , QrFragment .qrState)
@@ -369,4 +375,52 @@ class QrFragmentTest {
369
375
assertEquals(768 , qrFragment.previewSize?.width)
370
376
assertEquals(768 , qrFragment.previewSize?.height)
371
377
}
378
+
379
+ @Test
380
+ fun `tryOpenCamera displays error message if no camera is available` () {
381
+ val qrFragment = spy(QrFragment .newInstance(mock()))
382
+
383
+ qrFragment.textureView = mock()
384
+ qrFragment.cameraErrorView = mock()
385
+ qrFragment.customViewFinder = mock()
386
+
387
+ qrFragment.tryOpenCamera(0 , 0 )
388
+ verify(qrFragment.cameraErrorView).visibility = View .VISIBLE
389
+ verify(qrFragment.customViewFinder).visibility = View .GONE
390
+ }
391
+
392
+ @Test
393
+ fun `tryOpenCamera opens camera if available` () {
394
+ val qrFragment = spy(QrFragment .newInstance(mock()))
395
+
396
+ qrFragment.textureView = mock()
397
+ qrFragment.cameraErrorView = mock()
398
+ qrFragment.customViewFinder = mock()
399
+
400
+ qrFragment.tryOpenCamera(0 , 0 , skipCheck = true )
401
+ verify(qrFragment).openCamera(0 , 0 )
402
+ }
403
+
404
+ @Test
405
+ fun `tryOpenCamera displays error message if camera throws exception` () {
406
+ val qrFragment = spy(QrFragment .newInstance(mock()))
407
+ whenever(qrFragment.setUpCameraOutputs(anyInt(), anyInt())).then { }
408
+
409
+ qrFragment.textureView = mock()
410
+ qrFragment.cameraErrorView = mock()
411
+ qrFragment.customViewFinder = mock()
412
+
413
+ val cameraManager: CameraManager = mock()
414
+ whenever(cameraManager.openCamera(anyString(), any<CameraDevice .StateCallback >(), any()))
415
+ .thenThrow(IllegalStateException (" no camera" ))
416
+
417
+ val activity: FragmentActivity = mock()
418
+ whenever(activity.getSystemService(Context .CAMERA_SERVICE )).thenReturn(cameraManager)
419
+ whenever(qrFragment.activity).thenReturn(activity)
420
+ qrFragment.cameraId = " mockCamera"
421
+
422
+ qrFragment.tryOpenCamera(0 , 0 , skipCheck = true )
423
+ verify(qrFragment.cameraErrorView).visibility = View .VISIBLE
424
+ verify(qrFragment.customViewFinder).visibility = View .GONE
425
+ }
372
426
}
0 commit comments