@@ -102,6 +102,9 @@ class CameraAnimationsPluginImplTest {
102102 animators.forEach {
103103 verify { it.addInternalListener(any()) }
104104 }
105+ animators.forEach {
106+ assertTrue(cameraAnimationsPluginImpl.animators.contains(it))
107+ }
105108 }
106109
107110 @Test
@@ -117,6 +120,7 @@ class CameraAnimationsPluginImplTest {
117120 it.removeInternalListener()
118121 }
119122 }
123+ assertTrue(" Animators is not empty" , cameraAnimationsPluginImpl.animators.isEmpty())
120124 }
121125
122126 @Test
@@ -316,10 +320,14 @@ class CameraAnimationsPluginImplTest {
316320 every {
317321 mapCameraManagerDelegate.cameraState
318322 } answers { cameraPosition.toCameraState() }
319- every { mapCameraManagerDelegate.setCamera(any<CameraOptions >()) } answers {
323+
324+ every {
325+ mapCameraManagerDelegate.setCamera(any<CameraOptions >())
326+ } answers {
320327 cameraPosition = firstArg<CameraOptions >()
321328 cameraAnimationsPluginImpl.onCameraMove(cameraPosition.toCameraState())
322329 }
330+
323331 val targetPitch = 5.0
324332 val cameraOptions = CameraOptions .Builder ().pitch(targetPitch).build()
325333 val expectedValues = mutableSetOf (targetPitch)
@@ -372,6 +380,72 @@ class CameraAnimationsPluginImplTest {
372380 assertArrayEquals(expectedValues.toDoubleArray(), updatedValues.toDoubleArray(), EPS )
373381 }
374382
383+ @Test
384+ fun `two same immediate animations, second is skipped` () {
385+ var cameraPosition = CameraOptions .Builder ().build()
386+ every {
387+ mapCameraManagerDelegate.cameraState
388+ } answers {
389+ cameraPosition.toCameraState()
390+ }
391+ every {
392+ mapCameraManagerDelegate.setCamera(any<CameraOptions >())
393+ } answers {
394+ cameraPosition = firstArg<CameraOptions >()
395+ cameraAnimationsPluginImpl.onCameraMove(cameraPosition.toCameraState())
396+ }
397+
398+ val cameraAnimatorOptions = cameraAnimatorOptions(10.0 ) {
399+ startValue(10.0 )
400+ }
401+ val bearingFirst = CameraBearingAnimator (cameraAnimatorOptions, true ) {
402+ duration = 0
403+ }
404+ bearingFirst.addListener(
405+ onStart = {
406+ assertEquals(2 , cameraAnimationsPluginImpl.animators.size)
407+ assertEquals(false , (it as CameraAnimator <* >).skipped)
408+ }
409+ )
410+
411+ val bearingSecond = CameraBearingAnimator (cameraAnimatorOptions, true ) {
412+ duration = 0
413+ }
414+ bearingSecond.addListener(
415+ onStart = {
416+ assertEquals(1 , cameraAnimationsPluginImpl.animators.size)
417+ assertEquals(true , (it as CameraAnimator <* >).skipped)
418+ }
419+ )
420+
421+ cameraAnimationsPluginImpl.playAnimatorsTogether(bearingFirst, bearingSecond)
422+ assertTrue(" Animators is not empty" , cameraAnimationsPluginImpl.animators.isEmpty())
423+ }
424+
425+ @Test
426+ fun `animation skipped if camera already has target value` () {
427+ val cameraPosition = CameraOptions .Builder ().bearing(10.0 ).build().toCameraState()
428+ // Make sure current camera animations plugin has the right initial value
429+ cameraAnimationsPluginImpl.onCameraMove(cameraPosition)
430+
431+ val cameraAnimatorOptions = cameraAnimatorOptions(10.0 ) {
432+ startValue(10.0 )
433+ }
434+
435+ val bearingAnimator = CameraBearingAnimator (cameraAnimatorOptions, true ) {
436+ duration = 0
437+ }
438+ bearingAnimator.addListener(
439+ onStart = {
440+ assertEquals(1 , cameraAnimationsPluginImpl.animators.size)
441+ assertEquals(true , (it as CameraAnimator <* >).skipped)
442+ }
443+ )
444+
445+ cameraAnimationsPluginImpl.playAnimatorsTogether(bearingAnimator)
446+ assertTrue(" Animators is not empty" , cameraAnimationsPluginImpl.animators.isEmpty())
447+ }
448+
375449 @Test
376450 fun testEaseToSequenceDurationZero () {
377451 var cameraPosition = CameraState (
@@ -405,9 +479,9 @@ class CameraAnimationsPluginImplTest {
405479
406480 shadowOf(getMainLooper()).pause()
407481
408- val handler = Handler (getMainLooper())
409482 cameraAnimationsPluginImpl.easeTo(cameraOptions1, mapAnimationOptions { duration(0 ) })
410483
484+ val handler = Handler (getMainLooper())
411485 handler.postDelayed(
412486 {
413487 cameraAnimationsPluginImpl.easeTo(
0 commit comments