@@ -876,4 +876,188 @@ class NavigationCameraTest {
876876 val frameCamera : CameraOptions ,
877877 val frameAnimatorSet : MapboxAnimatorSet ,
878878 )
879+
880+ @Test
881+ fun `updateFollowingFrameTransitionOptions when FOLLOWING updates frame options` () {
882+ val initialFrameOpt = NavigationCameraTransitionOptions .Builder ()
883+ .maxDuration(250L )
884+ .build()
885+ val updatedFrameOpt = NavigationCameraTransitionOptions .Builder ()
886+ .maxDuration(100L )
887+ .build()
888+
889+ navigationCamera.requestNavigationCameraToFollowing(
890+ frameTransitionOptions = initialFrameOpt,
891+ )
892+ internalTransitionListenerSlot.captured.onAnimationStart(followingAnimatorSet)
893+ internalTransitionListenerSlot.captured.onAnimationEnd(followingAnimatorSet)
894+
895+ navigationCamera.updateFollowingFrameTransitionOptions(updatedFrameOpt)
896+
897+ val frameTransition = mockFrameTransitionForFollowing(updatedFrameOpt)
898+ internalDataSourceObserverSlot.captured.viewportDataSourceUpdated(viewportData)
899+
900+ verifyTransitionExecuted(
901+ AnimatorsCreator ::updateFrameForFollowing,
902+ frameTransition.frameCamera,
903+ updatedFrameOpt,
904+ frameTransition.frameAnimatorSet,
905+ )
906+ }
907+
908+ @Test
909+ fun `updateFollowingFrameTransitionOptions when TRANSITION_TO_FOLLOWING updates transition listener options` () {
910+ val initialFrameOpt = NavigationCameraTransitionOptions .Builder ()
911+ .maxDuration(250L )
912+ .build()
913+ val updatedFrameOpt = NavigationCameraTransitionOptions .Builder ()
914+ .maxDuration(100L )
915+ .build()
916+
917+ navigationCamera.requestNavigationCameraToFollowing(
918+ frameTransitionOptions = initialFrameOpt,
919+ )
920+ internalTransitionListenerSlot.captured.onAnimationStart(followingAnimatorSet)
921+
922+ navigationCamera.updateFollowingFrameTransitionOptions(updatedFrameOpt)
923+ internalTransitionListenerSlot.captured.onAnimationEnd(followingAnimatorSet)
924+
925+ val frameTransition = mockFrameTransitionForFollowing(updatedFrameOpt)
926+ internalDataSourceObserverSlot.captured.viewportDataSourceUpdated(viewportData)
927+
928+ verifyTransitionExecuted(
929+ AnimatorsCreator ::updateFrameForFollowing,
930+ frameTransition.frameCamera,
931+ updatedFrameOpt,
932+ frameTransition.frameAnimatorSet,
933+ )
934+ }
935+
936+ @Test
937+ fun `updateFollowingFrameTransitionOptions when IDLE does nothing` () {
938+ val updatedFrameOpt = NavigationCameraTransitionOptions .Builder ()
939+ .maxDuration(100L )
940+ .build()
941+
942+ navigationCamera.updateFollowingFrameTransitionOptions(updatedFrameOpt)
943+
944+ // Verify no side effects - state remains IDLE
945+ assertEquals(NavigationCameraState .IDLE , navigationCamera.state)
946+ }
947+
948+ @Test
949+ fun `updateFollowingFrameTransitionOptions when OVERVIEW does nothing` () {
950+ val updatedFrameOpt = NavigationCameraTransitionOptions .Builder ()
951+ .maxDuration(100L )
952+ .build()
953+
954+ navigationCamera.requestNavigationCameraToOverview()
955+ internalTransitionListenerSlot.captured.onAnimationStart(overviewAnimatorSet)
956+ internalTransitionListenerSlot.captured.onAnimationEnd(overviewAnimatorSet)
957+
958+ navigationCamera.updateFollowingFrameTransitionOptions(updatedFrameOpt)
959+
960+ val frameTransition = mockFrameTransitionForOverview(DEFAULT_FRAME_TRANSITION_OPT )
961+ internalDataSourceObserverSlot.captured.viewportDataSourceUpdated(viewportData)
962+
963+ // Verify it still uses default options, not the updated ones
964+ verifyTransitionExecuted(
965+ AnimatorsCreator ::updateFrameForOverview,
966+ frameTransition.frameCamera,
967+ DEFAULT_FRAME_TRANSITION_OPT ,
968+ frameTransition.frameAnimatorSet,
969+ )
970+ }
971+
972+ @Test
973+ fun `updateOverviewFrameTransitionOptions when OVERVIEW updates frame options` () {
974+ val initialFrameOpt = NavigationCameraTransitionOptions .Builder ()
975+ .maxDuration(250L )
976+ .build()
977+ val updatedFrameOpt = NavigationCameraTransitionOptions .Builder ()
978+ .maxDuration(100L )
979+ .build()
980+
981+ navigationCamera.requestNavigationCameraToOverview(
982+ frameTransitionOptions = initialFrameOpt,
983+ )
984+ internalTransitionListenerSlot.captured.onAnimationStart(overviewAnimatorSet)
985+ internalTransitionListenerSlot.captured.onAnimationEnd(overviewAnimatorSet)
986+
987+ navigationCamera.updateOverviewFrameTransitionOptions(updatedFrameOpt)
988+
989+ val frameTransition = mockFrameTransitionForOverview(updatedFrameOpt)
990+ internalDataSourceObserverSlot.captured.viewportDataSourceUpdated(viewportData)
991+
992+ verifyTransitionExecuted(
993+ AnimatorsCreator ::updateFrameForOverview,
994+ frameTransition.frameCamera,
995+ updatedFrameOpt,
996+ frameTransition.frameAnimatorSet,
997+ )
998+ }
999+
1000+ @Test
1001+ fun `updateOverviewFrameTransitionOptions when TRANSITION_TO_OVERVIEW updates transition listener options` () {
1002+ val initialFrameOpt = NavigationCameraTransitionOptions .Builder ()
1003+ .maxDuration(250L )
1004+ .build()
1005+ val updatedFrameOpt = NavigationCameraTransitionOptions .Builder ()
1006+ .maxDuration(100L )
1007+ .build()
1008+
1009+ navigationCamera.requestNavigationCameraToOverview(
1010+ frameTransitionOptions = initialFrameOpt,
1011+ )
1012+ internalTransitionListenerSlot.captured.onAnimationStart(overviewAnimatorSet)
1013+
1014+ navigationCamera.updateOverviewFrameTransitionOptions(updatedFrameOpt)
1015+ internalTransitionListenerSlot.captured.onAnimationEnd(overviewAnimatorSet)
1016+
1017+ val frameTransition = mockFrameTransitionForOverview(updatedFrameOpt)
1018+ internalDataSourceObserverSlot.captured.viewportDataSourceUpdated(viewportData)
1019+
1020+ verifyTransitionExecuted(
1021+ AnimatorsCreator ::updateFrameForOverview,
1022+ frameTransition.frameCamera,
1023+ updatedFrameOpt,
1024+ frameTransition.frameAnimatorSet,
1025+ )
1026+ }
1027+
1028+ @Test
1029+ fun `updateOverviewFrameTransitionOptions when IDLE does nothing` () {
1030+ val updatedFrameOpt = NavigationCameraTransitionOptions .Builder ()
1031+ .maxDuration(100L )
1032+ .build()
1033+
1034+ navigationCamera.updateOverviewFrameTransitionOptions(updatedFrameOpt)
1035+
1036+ // Verify no side effects - state remains IDLE
1037+ assertEquals(NavigationCameraState .IDLE , navigationCamera.state)
1038+ }
1039+
1040+ @Test
1041+ fun `updateOverviewFrameTransitionOptions when FOLLOWING does nothing` () {
1042+ val updatedFrameOpt = NavigationCameraTransitionOptions .Builder ()
1043+ .maxDuration(100L )
1044+ .build()
1045+
1046+ navigationCamera.requestNavigationCameraToFollowing()
1047+ internalTransitionListenerSlot.captured.onAnimationStart(followingAnimatorSet)
1048+ internalTransitionListenerSlot.captured.onAnimationEnd(followingAnimatorSet)
1049+
1050+ navigationCamera.updateOverviewFrameTransitionOptions(updatedFrameOpt)
1051+
1052+ val frameTransition = mockFrameTransitionForFollowing(DEFAULT_FRAME_TRANSITION_OPT )
1053+ internalDataSourceObserverSlot.captured.viewportDataSourceUpdated(viewportData)
1054+
1055+ // Verify it still uses default options, not the updated ones
1056+ verifyTransitionExecuted(
1057+ AnimatorsCreator ::updateFrameForFollowing,
1058+ frameTransition.frameCamera,
1059+ DEFAULT_FRAME_TRANSITION_OPT ,
1060+ frameTransition.frameAnimatorSet,
1061+ )
1062+ }
8791063}
0 commit comments