|
1 | 1 | package com.mapbox.navigation.ui.maps.internal.camera |
2 | 2 |
|
| 3 | +import io.mockk.clearMocks |
| 4 | +import io.mockk.mockk |
| 5 | +import io.mockk.verify |
| 6 | +import io.mockk.verifyOrder |
3 | 7 | import org.junit.Assert.assertEquals |
4 | 8 | import org.junit.Before |
5 | 9 | import org.junit.Test |
@@ -55,4 +59,69 @@ class FollowingFramingModeHolderTest { |
55 | 59 | assertEquals(FollowingFramingMode.LOCATION_INDICATOR, holder.mode) |
56 | 60 | assertEquals(FollowingFramingMode.MULTIPLE_POINTS, holder.prevMode) |
57 | 61 | } |
| 62 | + |
| 63 | + @Test |
| 64 | + fun `addObserver with custom initial mode invokes observer with that mode`() { |
| 65 | + holder.mode = FollowingFramingMode.MULTIPLE_POINTS |
| 66 | + val observer: (FollowingFramingMode?) -> Unit = mockk(relaxed = true) |
| 67 | + |
| 68 | + holder.addObserver(observer) |
| 69 | + |
| 70 | + verify(exactly = 1) { observer(FollowingFramingMode.MULTIPLE_POINTS) } |
| 71 | + } |
| 72 | + |
| 73 | + @Test |
| 74 | + fun `observer is notified when mode changes to different value`() { |
| 75 | + val observer: (FollowingFramingMode?) -> Unit = mockk(relaxed = true) |
| 76 | + holder.addObserver(observer) |
| 77 | + |
| 78 | + holder.mode = FollowingFramingMode.MULTIPLE_POINTS |
| 79 | + |
| 80 | + verifyOrder { |
| 81 | + observer(FollowingFramingMode.LOCATION_INDICATOR) // initial call |
| 82 | + observer(FollowingFramingMode.MULTIPLE_POINTS) // mode change |
| 83 | + } |
| 84 | + } |
| 85 | + |
| 86 | + @Test |
| 87 | + fun `observer is not notified when mode is set to same value`() { |
| 88 | + val observer: (FollowingFramingMode?) -> Unit = mockk(relaxed = true) |
| 89 | + holder.addObserver(observer) |
| 90 | + |
| 91 | + clearMocks(observer, answers = false) |
| 92 | + |
| 93 | + holder.mode = FollowingFramingMode.LOCATION_INDICATOR |
| 94 | + |
| 95 | + verify(exactly = 0) { observer(any()) } |
| 96 | + } |
| 97 | + |
| 98 | + @Test |
| 99 | + fun `multiple observers are all notified on mode change`() { |
| 100 | + val observer1: (FollowingFramingMode?) -> Unit = mockk(relaxed = true) |
| 101 | + val observer2: (FollowingFramingMode?) -> Unit = mockk(relaxed = true) |
| 102 | + val observer3: (FollowingFramingMode?) -> Unit = mockk(relaxed = true) |
| 103 | + |
| 104 | + holder.addObserver(observer1) |
| 105 | + holder.addObserver(observer2) |
| 106 | + holder.addObserver(observer3) |
| 107 | + |
| 108 | + holder.mode = FollowingFramingMode.MULTIPLE_POINTS |
| 109 | + |
| 110 | + verify(exactly = 1) { observer1(FollowingFramingMode.MULTIPLE_POINTS) } |
| 111 | + verify(exactly = 1) { observer2(FollowingFramingMode.MULTIPLE_POINTS) } |
| 112 | + verify(exactly = 1) { observer3(FollowingFramingMode.MULTIPLE_POINTS) } |
| 113 | + } |
| 114 | + |
| 115 | + @Test |
| 116 | + fun `removeObserver stops notifications to that observer`() { |
| 117 | + val observer: (FollowingFramingMode?) -> Unit = mockk(relaxed = true) |
| 118 | + holder.addObserver(observer) |
| 119 | + |
| 120 | + holder.removeObserver(observer) |
| 121 | + holder.mode = FollowingFramingMode.MULTIPLE_POINTS |
| 122 | + |
| 123 | + // Only the initial call from addObserver, no call after removal |
| 124 | + verify(exactly = 1) { observer(FollowingFramingMode.LOCATION_INDICATOR) } |
| 125 | + verify(exactly = 0) { observer(FollowingFramingMode.MULTIPLE_POINTS) } |
| 126 | + } |
58 | 127 | } |
0 commit comments