From 8a84ff752fe28431de5ef706788e809e3a4a284e Mon Sep 17 00:00:00 2001 From: Trevor McGuire Date: Thu, 28 May 2026 23:24:35 +0000 Subject: [PATCH] Add setSystemConstraints and setCurrentCameraState to FakeCameraSystem - Added setCurrentCameraState and setSystemConstraints test-only methods to FakeCameraSystem to allow for manipulating state flow easily. - Updated FakeCameraSystemTest to cover these two new methods. - Included KDocs as per the style guide. --- .../core/camera/testing/FakeCameraSystem.kt | 18 ++++++++++++++++++ .../camera/testing/FakeCameraSystemTest.kt | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/core/camera/testing/src/main/java/com/google/jetpackcamera/core/camera/testing/FakeCameraSystem.kt b/core/camera/testing/src/main/java/com/google/jetpackcamera/core/camera/testing/FakeCameraSystem.kt index fae3d24ac..63640504a 100644 --- a/core/camera/testing/src/main/java/com/google/jetpackcamera/core/camera/testing/FakeCameraSystem.kt +++ b/core/camera/testing/src/main/java/com/google/jetpackcamera/core/camera/testing/FakeCameraSystem.kt @@ -152,6 +152,15 @@ class FakeCameraSystem(defaultCameraSettings: CameraAppSettings = CameraAppSetti } private val _currentCameraState = MutableStateFlow(CameraState()) + + /** + * Test-only method to manipulate the current camera state. + * Use this to simulate changes in the camera's lifecycle or state (e.g., recording vs not recording) + * during tests, triggering downstream observers. + */ + fun setCurrentCameraState(cameraState: CameraState) { + _currentCameraState.value = cameraState + } override fun changeZoomRatio(newZoomState: CameraZoomRatio) { zoomChanges.update { newZoomState } } @@ -165,6 +174,15 @@ class FakeCameraSystem(defaultCameraSettings: CameraAppSettings = CameraAppSetti override fun getCurrentCameraState(): StateFlow = _currentCameraState.asStateFlow() private val _systemConstraints = MutableStateFlow(null) + + /** + * Test-only method to manipulate the camera system constraints. + * Use this to simulate different device capabilities (e.g., available lenses, flash support) + * during tests, ensuring the UI adapts correctly. + */ + fun setSystemConstraints(systemConstraints: CameraSystemConstraints?) { + _systemConstraints.value = systemConstraints + } override fun getSystemConstraints(): StateFlow = _systemConstraints.asStateFlow() diff --git a/core/camera/testing/src/test/java/com/google/jetpackcamera/core/camera/testing/FakeCameraSystemTest.kt b/core/camera/testing/src/test/java/com/google/jetpackcamera/core/camera/testing/FakeCameraSystemTest.kt index 9dfd6955b..984e01870 100644 --- a/core/camera/testing/src/test/java/com/google/jetpackcamera/core/camera/testing/FakeCameraSystemTest.kt +++ b/core/camera/testing/src/test/java/com/google/jetpackcamera/core/camera/testing/FakeCameraSystemTest.kt @@ -16,10 +16,12 @@ package com.google.jetpackcamera.core.camera.testing import com.google.common.truth.Truth +import com.google.jetpackcamera.core.camera.CameraState import com.google.jetpackcamera.core.camera.CameraSystem import com.google.jetpackcamera.model.FlashMode import com.google.jetpackcamera.model.LensFacing import com.google.jetpackcamera.settings.model.DEFAULT_CAMERA_APP_SETTINGS +import com.google.jetpackcamera.settings.model.TYPICAL_SYSTEM_CONSTRAINTS import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.consumeAsFlow @@ -149,6 +151,22 @@ class FakeCameraSystemTest { ).inOrder() } + @Test + fun setSystemConstraints_updatesFlow() = runTest(testDispatcher) { + cameraSystem.setSystemConstraints(TYPICAL_SYSTEM_CONSTRAINTS) + advanceUntilIdle() + Truth.assertThat( + cameraSystem.getSystemConstraints().value + ).isEqualTo(TYPICAL_SYSTEM_CONSTRAINTS) + } + + @Test + fun setCurrentCameraState_updatesFlow() = runTest(testDispatcher) { + val newState = CameraState(isCameraRunning = true) + cameraSystem.setCurrentCameraState(newState) + Truth.assertThat(cameraSystem.getCurrentCameraState().value).isEqualTo(newState) + } + private fun TestScope.initAndRunCamera() { backgroundScope.launch(UnconfinedTestDispatcher(testScheduler)) { cameraSystem.initialize(