react-native-navigation 7.24.3 → 7.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/lib/android/app/build.gradle +12 -9
  2. package/lib/android/app/src/main/java/com/reactnativenavigation/options/Options.java +2 -0
  3. package/lib/android/app/src/main/java/com/reactnativenavigation/options/layout/LayoutInsets.kt +44 -0
  4. package/lib/android/app/src/main/java/com/reactnativenavigation/options/layout/LayoutOptions.kt +71 -0
  5. package/lib/android/app/src/main/java/com/reactnativenavigation/utils/PrimitiveExt.kt +9 -0
  6. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/component/ComponentViewController.java +4 -3
  7. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/navigator/Navigator.java +5 -0
  8. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/viewcontroller/Presenter.java +23 -7
  9. package/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/viewcontroller/ViewController.java +12 -3
  10. package/lib/dist/src/interfaces/Options.d.ts +10 -0
  11. package/lib/ios/RNNBasePresenter.m +17 -0
  12. package/lib/ios/RNNBottomTabsController.m +1 -0
  13. package/lib/ios/RNNBridgeManager.mm +5 -3
  14. package/lib/ios/RNNComponentViewController.m +5 -0
  15. package/lib/ios/RNNLayoutOptions.h +2 -1
  16. package/lib/ios/RNNLayoutOptions.m +4 -0
  17. package/lib/ios/RNNModalHostViewManagerHandler.h +11 -0
  18. package/lib/ios/RNNModalHostViewManagerHandler.m +40 -0
  19. package/lib/ios/RNNModalManager.h +2 -2
  20. package/lib/ios/RNNModalManager.m +0 -26
  21. package/lib/ios/RNNStackPresenter.m +1 -0
  22. package/lib/ios/ReactNativeNavigation.xcodeproj/project.pbxproj +8 -0
  23. package/lib/src/interfaces/Options.ts +12 -0
  24. package/package.json +3 -1
  25. package/.buildkite/pipeline.yml +0 -59
  26. package/lib/android/app/src/main/java/com/reactnativenavigation/options/LayoutOptions.java +0 -48
  27. package/lib/android/app/src/test/java/com/reactnativenavigation/BaseTest.java +0 -178
  28. package/lib/android/app/src/test/java/com/reactnativenavigation/EnvironmentTest.java +0 -43
  29. package/lib/android/app/src/test/java/com/reactnativenavigation/TestActivity.java +0 -23
  30. package/lib/android/app/src/test/java/com/reactnativenavigation/TestApplication.java +0 -35
  31. package/lib/android/app/src/test/java/com/reactnativenavigation/TestUtils.java +0 -62
  32. package/lib/android/app/src/test/java/com/reactnativenavigation/fakes/IconResolverFake.kt +0 -8
  33. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/BackDrawable.java +0 -30
  34. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/ImageLoaderMock.kt +0 -49
  35. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/Mocks.kt +0 -18
  36. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/SimpleComponentViewController.java +0 -15
  37. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/SimpleOverlay.java +0 -54
  38. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/SimpleViewController.java +0 -113
  39. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/TestComponentLayout.java +0 -79
  40. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/TestComponentViewCreator.java +0 -18
  41. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/TestReactView.java +0 -71
  42. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/TitleBarButtonCreatorMock.java +0 -34
  43. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/TitleBarReactViewCreatorMock.java +0 -20
  44. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/TopBarBackgroundViewCreatorMock.java +0 -20
  45. package/lib/android/app/src/test/java/com/reactnativenavigation/mocks/TypefaceLoaderMock.kt +0 -21
  46. package/lib/android/app/src/test/java/com/reactnativenavigation/options/LayoutNodeParserTest.java +0 -51
  47. package/lib/android/app/src/test/java/com/reactnativenavigation/options/OptionsTest.java +0 -315
  48. package/lib/android/app/src/test/java/com/reactnativenavigation/options/OrientationOptionsTest.java +0 -81
  49. package/lib/android/app/src/test/java/com/reactnativenavigation/options/TopBarButtonsTest.kt +0 -95
  50. package/lib/android/app/src/test/java/com/reactnativenavigation/options/TransitionAnimationOptionsTest.kt +0 -122
  51. package/lib/android/app/src/test/java/com/reactnativenavigation/options/parsers/BoolParserTest.java +0 -28
  52. package/lib/android/app/src/test/java/com/reactnativenavigation/options/parsers/ColorParseTest.java +0 -50
  53. package/lib/android/app/src/test/java/com/reactnativenavigation/options/parsers/JSONParserTest.java +0 -64
  54. package/lib/android/app/src/test/java/com/reactnativenavigation/presentation/PresenterTest.java +0 -56
  55. package/lib/android/app/src/test/java/com/reactnativenavigation/presentation/RenderCheckerTest.java +0 -59
  56. package/lib/android/app/src/test/java/com/reactnativenavigation/presentation/SideMenuPresenterTest.java +0 -35
  57. package/lib/android/app/src/test/java/com/reactnativenavigation/react/NavigationModuleTest.java +0 -102
  58. package/lib/android/app/src/test/java/com/reactnativenavigation/react/ReloadListenerTest.java +0 -24
  59. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/AnimationHelper.kt +0 -33
  60. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/ButtonPresenterTest.java +0 -241
  61. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/ButtonSpanTest.java +0 -57
  62. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/CompatUtilsTest.java +0 -17
  63. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/LayoutFactoryTest.java +0 -78
  64. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/MotionEventTest.kt +0 -47
  65. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/NativeCommandListenerTest.java +0 -60
  66. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/OptionHelper.java +0 -16
  67. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/ReflectionUtilsTest.java +0 -26
  68. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/StringUtilsTest.java +0 -19
  69. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/SystemUiUtilsTest.kt +0 -27
  70. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/TitleAndButtonsMeasurerTest.kt +0 -357
  71. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/TitleBarHelper.java +0 -54
  72. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/UiThreadTest.java +0 -29
  73. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/UiUtilsTest.java +0 -22
  74. package/lib/android/app/src/test/java/com/reactnativenavigation/utils/ViewHelper.java +0 -9
  75. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/OptionsApplyingTest.java +0 -149
  76. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabPresenterTest.java +0 -206
  77. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsAttacherTest.java +0 -62
  78. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsControllerTest.kt +0 -589
  79. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsPresenterTest.kt +0 -173
  80. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/attacher/modes/AfterInitialTabTest.java +0 -38
  81. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/attacher/modes/AttachModeTest.java +0 -86
  82. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/attacher/modes/OnSwitchToTabTest.java +0 -31
  83. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/attacher/modes/TogetherTest.java +0 -20
  84. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/button/NavigationIconResolverTest.java +0 -78
  85. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/child/ChildControllerTest.java +0 -80
  86. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/child/ChildControllersRegistryTest.java +0 -56
  87. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/component/ComponentViewControllerTest.java +0 -216
  88. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/externalcomponent/ExternalComponentViewControllerTest.java +0 -97
  89. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/externalcomponent/FragmentCreatorMock.java +0 -34
  90. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/externalcomponent/SomeFragment.java +0 -8
  91. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/fakes/FakeParentController.kt +0 -33
  92. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/modal/ModalAnimatorMock.java +0 -40
  93. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/modal/ModalAnimatorTest.kt +0 -213
  94. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/modal/ModalPresenterTest.java +0 -319
  95. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/modal/ModalStackTest.java +0 -367
  96. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/navigator/NavigatorTest.java +0 -898
  97. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/navigator/RootPresenterTest.kt +0 -254
  98. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/overlay/OverlayManagerTest.java +0 -108
  99. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/parent/ParentControllerTest.java +0 -299
  100. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/sidemenu/SideMenuControllerTest.java +0 -446
  101. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/BackButtonHelperTest.java +0 -77
  102. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/FloatingActionButtonTest.java +0 -154
  103. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/IdStackTest.java +0 -114
  104. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackAnimatorTest.kt +0 -241
  105. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackControllerTest.kt +0 -1165
  106. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/StackPresenterTest.kt +0 -1081
  107. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/TitleBarButtonControllerTest.java +0 -61
  108. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/TitleBarReactViewControllerTest.java +0 -43
  109. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/TopBarButtonControllerTest.java +0 -120
  110. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/stack/TopBarControllerTest.kt +0 -432
  111. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/toptabs/TopTabsViewControllerTest.java +0 -249
  112. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/viewcontroller/ViewControllerTest.java +0 -337
  113. package/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/viewcontroller/YellowBoxDelegateTest.java +0 -68
  114. package/lib/android/app/src/test/java/com/reactnativenavigation/views/OverlayTouchDelegateTest.java +0 -60
  115. package/lib/android/app/src/test/java/com/reactnativenavigation/views/TitleAndButtonsContainerTest.kt +0 -477
  116. package/lib/android/app/src/test/java/com/reactnativenavigation/views/TopBarTest.java +0 -82
  117. package/lib/android/app/src/test/java/com/reactnativenavigation/views/animations/BaseViewAnimatorTest.kt +0 -109
  118. package/lib/android/app/src/test/java/com/reactnativenavigation/views/animations/DefaultViewAnimatorCreatorFake.kt +0 -36
  119. package/lib/android/app/src/test/java/com/reactnativenavigation/views/bottomtabs/BottomTabsContainerTest.kt +0 -101
  120. package/lib/android/app/src/test/java/com/reactnativenavigation/views/bottomtabs/BottomTabsTest.kt +0 -40
  121. package/lib/android/app/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker +0 -1
@@ -1,589 +0,0 @@
1
- package com.reactnativenavigation.viewcontrollers.bottomtabs
2
-
3
- import android.app.Activity
4
- import android.graphics.Color
5
- import android.view.Gravity
6
- import android.view.View
7
- import android.view.ViewGroup.MarginLayoutParams
8
- import androidx.coordinatorlayout.widget.CoordinatorLayout
9
- import com.aurelhubert.ahbottomnavigation.AHBottomNavigation.TitleState
10
- import com.reactnativenavigation.BaseTest
11
- import com.reactnativenavigation.TestUtils
12
- import com.reactnativenavigation.mocks.ImageLoaderMock.mock
13
- import com.reactnativenavigation.mocks.SimpleViewController
14
- import com.reactnativenavigation.mocks.TypefaceLoaderMock
15
- import com.reactnativenavigation.options.BottomTabsOptions
16
- import com.reactnativenavigation.options.HwBackBottomTabsBehaviour
17
- import com.reactnativenavigation.options.Options
18
- import com.reactnativenavigation.options.params.*
19
- import com.reactnativenavigation.react.CommandListenerAdapter
20
- import com.reactnativenavigation.react.events.EventEmitter
21
- import com.reactnativenavigation.utils.OptionHelper
22
- import com.reactnativenavigation.utils.SystemUiUtils.getStatusBarHeight
23
- import com.reactnativenavigation.utils.SystemUiUtils.saveStatusBarHeight
24
- import com.reactnativenavigation.viewcontrollers.bottomtabs.attacher.BottomTabsAttacher
25
- import com.reactnativenavigation.viewcontrollers.child.ChildControllersRegistry
26
- import com.reactnativenavigation.viewcontrollers.fakes.FakeParentController
27
- import com.reactnativenavigation.viewcontrollers.parent.ParentController
28
- import com.reactnativenavigation.viewcontrollers.stack.StackController
29
- import com.reactnativenavigation.viewcontrollers.viewcontroller.Presenter
30
- import com.reactnativenavigation.viewcontrollers.viewcontroller.ViewController
31
- import com.reactnativenavigation.views.bottomtabs.BottomTabs
32
- import com.reactnativenavigation.views.bottomtabs.BottomTabsContainer
33
- import com.reactnativenavigation.views.bottomtabs.BottomTabsLayout
34
- import org.assertj.core.api.Java6Assertions
35
- import org.junit.Test
36
- import org.mockito.ArgumentCaptor
37
- import org.mockito.ArgumentMatchers
38
- import org.mockito.Mockito
39
- import org.mockito.kotlin.any
40
- import org.mockito.kotlin.eq
41
- import org.mockito.kotlin.times
42
- import java.util.*
43
-
44
- class BottomTabsControllerTest : BaseTest() {
45
- private lateinit var activity: Activity
46
- private lateinit var bottomTabs: BottomTabs
47
- private lateinit var bottomTabsContainer: BottomTabsContainer
48
- private lateinit var uut: BottomTabsController
49
- private val initialOptions = Options()
50
- private lateinit var child1: ViewController<*>
51
- private lateinit var child2: ViewController<*>
52
- private lateinit var child3: ViewController<*>
53
- private lateinit var stackChild: ViewController<*>
54
- private lateinit var child4: StackController
55
- private lateinit var child5: ViewController<*>
56
- private val tabOptions = OptionHelper.createBottomTabOptions()
57
- private val imageLoaderMock = mock()
58
- private lateinit var eventEmitter: EventEmitter
59
- private lateinit var childRegistry: ChildControllersRegistry
60
- private lateinit var tabs: MutableList<ViewController<*>>
61
- private lateinit var presenter: BottomTabsPresenter
62
- private lateinit var bottomTabPresenter: BottomTabPresenter
63
- private lateinit var tabsAttacher: BottomTabsAttacher
64
- override fun beforeEach() {
65
- super.beforeEach()
66
- activity = newActivity()
67
- childRegistry = ChildControllersRegistry()
68
- eventEmitter = Mockito.mock(EventEmitter::class.java)
69
- prepareViewsForTests()
70
- saveStatusBarHeight(63)
71
- }
72
-
73
- @Test
74
- fun createView_checkProperStructure() {
75
- idleMainLooper()
76
- Java6Assertions.assertThat(uut.view).isInstanceOf(CoordinatorLayout::class.java)
77
- Java6Assertions.assertThat(uut.view.getChildAt(uut.view.childCount - 1)).isInstanceOf(
78
- BottomTabsContainer::class.java
79
- )
80
- Java6Assertions.assertThat((uut.bottomTabsContainer.layoutParams as CoordinatorLayout.LayoutParams).gravity)
81
- .isEqualTo(Gravity.BOTTOM)
82
- }
83
-
84
- @Test
85
- fun createView_tabsWithoutIconsAreAccepted() {
86
- tabOptions.bottomTabOptions.icon = NullText()
87
- prepareViewsForTests()
88
- Java6Assertions.assertThat(uut.bottomTabs.itemsCount).isEqualTo(tabs.size)
89
- }
90
-
91
- @Test
92
- fun createView_showTitlesWhenAllTabsDontHaveIcons() {
93
- tabOptions.bottomTabOptions.icon = NullText()
94
- Java6Assertions.assertThat(tabOptions.bottomTabsOptions.titleDisplayMode.hasValue()).isFalse
95
- prepareViewsForTests()
96
- presenter.applyOptions(Options.EMPTY)
97
- Java6Assertions.assertThat(bottomTabsContainer.bottomTabs.titleState).isEqualTo(TitleState.ALWAYS_SHOW)
98
- }
99
-
100
- @Test(expected = RuntimeException::class)
101
- fun setTabs_ThrowWhenMoreThan5() {
102
- tabs.add(SimpleViewController(activity, childRegistry, "6", tabOptions))
103
- createBottomTabs()
104
- idleMainLooper()
105
- }
106
-
107
- @Test
108
- fun parentControllerIsSet() {
109
- uut = createBottomTabs()
110
- for (tab in tabs) {
111
- Java6Assertions.assertThat(tab.parentController).isEqualTo(uut)
112
- }
113
- }
114
-
115
- @Test
116
- fun setTabs_allChildViewsAreAttachedToHierarchy() {
117
- uut.onViewWillAppear()
118
- Java6Assertions.assertThat(uut.view.childCount).isEqualTo(6)
119
- for (child in uut.childControllers) {
120
- Java6Assertions.assertThat(child.view.parent).isNotNull
121
- }
122
- }
123
-
124
- @Test
125
- fun setTabs_firstChildIsVisibleOtherAreGone() {
126
- uut.onViewWillAppear()
127
- for (i in uut.childControllers.indices) {
128
- Java6Assertions.assertThat(uut.view.getChildAt(i)).isEqualTo(tabs[i].view)
129
- Java6Assertions.assertThat(uut.view.getChildAt(i).visibility)
130
- .isEqualTo(if (i == 0) View.VISIBLE else View.INVISIBLE)
131
- }
132
- }
133
-
134
- @Test
135
- fun onTabSelected() {
136
- uut.ensureViewIsCreated()
137
- Java6Assertions.assertThat(uut.selectedIndex).isZero
138
- Java6Assertions.assertThat(((uut.childControllers as List<*>)[0] as ViewController<*>).view.visibility)
139
- .isEqualTo(
140
- View.VISIBLE
141
- )
142
- uut.onTabSelected(3, false)
143
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(3)
144
- Java6Assertions.assertThat(((uut.childControllers as List<*>)[0] as ViewController<*>).view.visibility)
145
- .isEqualTo(
146
- View.INVISIBLE
147
- )
148
- Java6Assertions.assertThat(((uut.childControllers as List<*>)[3] as ViewController<*>).view.visibility)
149
- .isEqualTo(
150
- View.VISIBLE
151
- )
152
- Mockito.verify(eventEmitter).emitBottomTabSelected(0, 3)
153
- }
154
-
155
- @Test
156
- fun onTabReSelected() {
157
- uut.ensureViewIsCreated()
158
- Java6Assertions.assertThat(uut.selectedIndex).isZero
159
- uut.onTabSelected(0, true)
160
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(0)
161
- Java6Assertions.assertThat(((uut.childControllers as List<*>)[0] as ViewController<*>).view.parent).isNotNull
162
- Mockito.verify(eventEmitter).emitBottomTabSelected(0, 0)
163
- }
164
-
165
- @Test
166
- fun handleBack_DelegatesToSelectedChild() {
167
- uut.ensureViewIsCreated()
168
- Java6Assertions.assertThat(uut.handleBack(CommandListenerAdapter())).isFalse
169
- uut.selectTab(4)
170
- Java6Assertions.assertThat(uut.handleBack(CommandListenerAdapter())).isTrue
171
- Mockito.verify(child5).handleBack(ArgumentMatchers.any())
172
- }
173
-
174
- @Test
175
- fun `handleBack - PrevSelection - reselect tab selection history of navigation when root has bottom tabs`() {
176
- val options = Options().apply {
177
- hardwareBack.bottomTabOnPress = HwBackBottomTabsBehaviour.PrevSelection
178
- }
179
- prepareViewsForTests(options = options)
180
- idleMainLooper()
181
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(0)
182
-
183
- uut.selectTab(1)
184
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(1)
185
-
186
- uut.selectTab(3)
187
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(3)
188
-
189
- uut.selectTab(2)
190
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(2)
191
-
192
- Java6Assertions.assertThat(uut.handleBack(CommandListenerAdapter())).isTrue
193
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(3)
194
-
195
- Java6Assertions.assertThat(uut.handleBack(CommandListenerAdapter())).isTrue
196
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(1)
197
-
198
- Java6Assertions.assertThat(uut.handleBack(CommandListenerAdapter())).isTrue
199
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(0)
200
-
201
- Java6Assertions.assertThat(uut.handleBack(CommandListenerAdapter())).isFalse
202
- }
203
-
204
- @Test
205
- fun `handleBack - JumpToFirst - reselect first tab`() {
206
- val options = Options().apply {
207
- hardwareBack.bottomTabOnPress = HwBackBottomTabsBehaviour.JumpToFirst
208
- }
209
- prepareViewsForTests(options = options)
210
- idleMainLooper()
211
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(0)
212
-
213
- uut.selectTab(1)
214
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(1)
215
-
216
- uut.selectTab(3)
217
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(3)
218
-
219
- uut.selectTab(2)
220
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(2)
221
-
222
- Java6Assertions.assertThat(uut.handleBack(CommandListenerAdapter())).isTrue
223
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(0)
224
-
225
- Java6Assertions.assertThat(uut.handleBack(CommandListenerAdapter())).isFalse
226
- }
227
-
228
- @Test
229
- fun `handleBack - Default - should exit app with no reselection`() {
230
-
231
- prepareViewsForTests()
232
- idleMainLooper()
233
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(0)
234
-
235
- uut.selectTab(1)
236
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(1)
237
-
238
- uut.selectTab(3)
239
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(3)
240
-
241
- uut.selectTab(2)
242
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(2)
243
-
244
- Java6Assertions.assertThat(uut.handleBack(CommandListenerAdapter())).isFalse
245
- }
246
-
247
- @Test
248
- fun `handleBack - Exit - reselect first tab`() {
249
- val options = Options().apply {
250
- hardwareBack.bottomTabOnPress = HwBackBottomTabsBehaviour.Exit
251
- }
252
- prepareViewsForTests(options = options)
253
- idleMainLooper()
254
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(0)
255
-
256
- uut.selectTab(1)
257
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(1)
258
-
259
- uut.selectTab(3)
260
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(3)
261
-
262
- uut.selectTab(2)
263
- Java6Assertions.assertThat(uut.selectedIndex).isEqualTo(2)
264
-
265
- Java6Assertions.assertThat(uut.handleBack(CommandListenerAdapter())).isFalse
266
- }
267
-
268
- @Test
269
- fun applyChildOptions_bottomTabsOptionsAreClearedAfterApply() {
270
- val parent = Mockito.mock(ParentController::class.java)
271
- uut.parentController = parent
272
- child1.options.bottomTabsOptions.backgroundColor = ThemeColour(Colour(Color.RED))
273
- child1.onViewWillAppear()
274
- val optionsCaptor = ArgumentCaptor.forClass(
275
- Options::class.java
276
- )
277
- Mockito.verify(parent).applyChildOptions(optionsCaptor.capture(), ArgumentMatchers.any())
278
- Java6Assertions.assertThat(optionsCaptor.value.bottomTabsOptions.backgroundColor.hasValue()).isFalse
279
- }
280
-
281
- @Test
282
- fun applyOptions_bottomTabsCreateViewOnlyOnce() {
283
- idleMainLooper()
284
- Mockito.verify(presenter).applyOptions(any())
285
- Mockito.verify(bottomTabsContainer.bottomTabs, times(2))
286
- .superCreateItems() // first time when view is created, second time when options are applied
287
- }
288
-
289
- @Test
290
- fun onSizeChanged_recreateItemsIfSizeHasChanged() {
291
- val numberOfPreviousInvocations = 1
292
- bottomTabs.onSizeChanged(0, 0, 0, 0)
293
- Mockito.verify(bottomTabs, Mockito.times(numberOfPreviousInvocations)).superCreateItems()
294
- bottomTabs.onSizeChanged(100, 0, 0, 0)
295
- Mockito.verify(bottomTabs, Mockito.times(numberOfPreviousInvocations)).superCreateItems()
296
- bottomTabs.onSizeChanged(1080, 147, 0, 0)
297
- Mockito.verify(bottomTabs, Mockito.times(numberOfPreviousInvocations + 1)).superCreateItems()
298
- bottomTabs.onSizeChanged(1920, 147, 0, 0)
299
- Mockito.verify(bottomTabs, Mockito.times(numberOfPreviousInvocations + 2)).superCreateItems()
300
- Mockito.`when`(bottomTabs.itemsCount).thenReturn(0)
301
- bottomTabs.onSizeChanged(1080, 147, 0, 0)
302
- Mockito.verify(bottomTabs, Mockito.times(numberOfPreviousInvocations + 2)).superCreateItems()
303
- }
304
-
305
- @Test
306
- fun mergeOptions_currentTabIndex() {
307
- uut.ensureViewIsCreated()
308
- Java6Assertions.assertThat(uut.selectedIndex).isZero
309
- val options = Options()
310
- options.bottomTabsOptions.currentTabIndex = Number(1)
311
- uut.mergeOptions(options)
312
- Java6Assertions.assertThat(uut.selectedIndex).isOne
313
- Mockito.verify(eventEmitter, Mockito.times(0)).emitBottomTabSelected(
314
- ArgumentMatchers.any(
315
- Int::class.java
316
- ), ArgumentMatchers.any(Int::class.java)
317
- )
318
- }
319
- @Test
320
- fun `mergeOptions - select tab calls onViewWillAppear to apply options on the selected child`(){
321
- uut.ensureViewIsCreated()
322
- Java6Assertions.assertThat(uut.selectedIndex).isZero
323
-
324
- val options = Options()
325
- options.bottomTabsOptions.currentTabIndex = Number(1)
326
- uut.mergeOptions(options)
327
- Java6Assertions.assertThat(uut.selectedIndex).isOne
328
- Mockito.verify(child2).onViewWillAppear()
329
- Mockito.verify(child2).onViewDidAppear()
330
-
331
- options.bottomTabsOptions.currentTabIndex = Number(0)
332
- uut.mergeOptions(options)
333
- Java6Assertions.assertThat(uut.selectedIndex).isZero
334
- Mockito.verify(child1).onViewWillAppear()
335
- Mockito.verify(child1).onViewDidAppear()
336
- }
337
- @Test
338
- fun mergeOptions_drawBehind() {
339
- Java6Assertions.assertThat(uut.getBottomInset(child1)).isEqualTo(uut.bottomTabs.height)
340
- val o1 = Options()
341
- o1.bottomTabsOptions.drawBehind = Bool(true)
342
- child1.mergeOptions(o1)
343
- Java6Assertions.assertThat(uut.getBottomInset(child1)).isEqualTo(0)
344
- val o2 = Options()
345
- o2.topBar.title.text = Text("Some text")
346
- child1.mergeOptions(o1)
347
- Java6Assertions.assertThat(uut.getBottomInset(child1)).isEqualTo(0)
348
- }
349
-
350
- @Test
351
- fun mergeOptions_drawBehind_stack() {
352
- uut.ensureViewIsCreated()
353
- uut.selectTab(3)
354
- Java6Assertions.assertThat((stackChild.view.layoutParams as MarginLayoutParams).bottomMargin).isEqualTo(
355
- bottomTabs.height
356
- )
357
- val o1 = Options()
358
- o1.bottomTabsOptions.drawBehind = Bool(true)
359
- stackChild.mergeOptions(o1)
360
- Java6Assertions.assertThat((stackChild.view.layoutParams as MarginLayoutParams).bottomMargin).isEqualTo(0)
361
- }
362
-
363
- @Test
364
- fun mergeOptions_mergesBottomTabOptions() {
365
- val options = Options()
366
- uut.mergeOptions(options)
367
- Mockito.verify(bottomTabPresenter).mergeOptions(options)
368
- }
369
-
370
- @Test
371
- fun applyChildOptions_resolvedOptionsAreUsed() {
372
- val childOptions = Options()
373
- val pushedScreen = SimpleViewController(activity, childRegistry, "child4.1", childOptions)
374
- disablePushAnimation(pushedScreen)
375
- child4 = spyOnStack(pushedScreen)
376
- tabs = ArrayList(listOf(child4))
377
- tabsAttacher = BottomTabsAttacher(tabs, presenter, Options.EMPTY)
378
- initialOptions.bottomTabsOptions.currentTabIndex = Number(0)
379
- val resolvedOptions = Options()
380
- uut = object : BottomTabsController(
381
- activity,
382
- tabs,
383
- childRegistry,
384
- eventEmitter,
385
- imageLoaderMock,
386
- "uut",
387
- initialOptions,
388
- Presenter(activity, Options()),
389
- tabsAttacher,
390
- presenter,
391
- BottomTabPresenter(activity, tabs, mock(), TypefaceLoaderMock(), Options())
392
- ) {
393
- override fun resolveCurrentOptions(): Options {
394
- return resolvedOptions
395
- }
396
-
397
- override fun createBottomTabs(): BottomTabs {
398
- return object : BottomTabs(activity) {
399
- override fun createItems() {}
400
- }
401
- }
402
- }
403
- activity.setContentView(uut.view)
404
- idleMainLooper()
405
- Mockito.verify(presenter, Mockito.times(2))
406
- .applyChildOptions(eq(resolvedOptions), any())
407
- }
408
-
409
- @Test
410
- fun child_mergeOptions_currentTabIndex() {
411
- uut.ensureViewIsCreated()
412
- Java6Assertions.assertThat(uut.selectedIndex).isZero
413
- val options = Options()
414
- options.bottomTabsOptions.currentTabIndex = Number(1)
415
- child1.mergeOptions(options)
416
- Java6Assertions.assertThat(uut.selectedIndex).isOne
417
- }
418
-
419
- @Test
420
- fun resolveCurrentOptions_returnsFirstTabIfInvokedBeforeViewIsCreated() {
421
- uut = createBottomTabs()
422
- Java6Assertions.assertThat(uut.currentChild).isEqualTo(tabs[0])
423
- }
424
-
425
- @Test
426
- fun buttonPressInvokedOnCurrentTab() {
427
- uut.ensureViewIsCreated()
428
- uut.selectTab(4)
429
- uut.sendOnNavigationButtonPressed("btn1")
430
- Mockito.verify(child5, Mockito.times(1)).sendOnNavigationButtonPressed("btn1")
431
- }
432
-
433
- @Test
434
- fun push() {
435
- uut.selectTab(3)
436
- val stackChild2 = SimpleViewController(activity, childRegistry, "stackChild2", Options())
437
- disablePushAnimation(stackChild2)
438
- TestUtils.hideBackButton(stackChild2)
439
- Java6Assertions.assertThat(child4.size()).isEqualTo(1)
440
- child4.push(stackChild2, CommandListenerAdapter())
441
- Java6Assertions.assertThat(child4.size()).isEqualTo(2)
442
- }
443
-
444
- @Test
445
- fun oneTimeOptionsAreAppliedOnce() {
446
- val options = Options()
447
- options.bottomTabsOptions.currentTabIndex = Number(1)
448
- Java6Assertions.assertThat(uut.selectedIndex).isZero
449
- uut.mergeOptions(options)
450
- Java6Assertions.assertThat(uut.selectedIndex).isOne
451
- Java6Assertions.assertThat(uut.options.bottomTabsOptions.currentTabIndex.hasValue()).isFalse
452
- Java6Assertions.assertThat(uut.initialOptions.bottomTabsOptions.currentTabIndex.hasValue()).isFalse
453
- }
454
-
455
- @Test
456
- fun selectTab() {
457
- uut.selectTab(1)
458
- Mockito.verify(tabsAttacher).onTabSelected(tabs[1])
459
- }
460
-
461
- @Test
462
- fun selectTab_onViewDidAppearIsInvokedAfterSelection() {
463
- uut.selectTab(1)
464
- Mockito.verify(child2).onViewDidAppear()
465
- }
466
-
467
- @Test
468
- fun creatingTabs_onViewDidAppearInvokedAfterInitialTabIndexSet() {
469
- val options = Options.EMPTY.copy()
470
- options.bottomTabsOptions.currentTabIndex = Number(1)
471
- prepareViewsForTests(options.bottomTabsOptions)
472
- idleMainLooper()
473
- Mockito.verify(tabs[0], Mockito.times(0)).onViewDidAppear()
474
- Mockito.verify(tabs[1], Mockito.times(1)).onViewDidAppear()
475
- Mockito.verify(tabs[2], Mockito.times(0)).onViewDidAppear()
476
- Mockito.verify(tabs[3], Mockito.times(0)).onViewDidAppear()
477
- Mockito.verify(tabs[4], Mockito.times(0)).onViewDidAppear()
478
- }
479
-
480
- @Test
481
- fun topInset() {
482
- Java6Assertions.assertThat(child1.topInset).isEqualTo(statusBarHeight)
483
- Java6Assertions.assertThat(child2.topInset).isEqualTo(statusBarHeight)
484
- child1.options.statusBar.drawBehind = Bool(true)
485
- Java6Assertions.assertThat(child1.topInset).isEqualTo(0)
486
- Java6Assertions.assertThat(child2.topInset).isEqualTo(statusBarHeight)
487
- Java6Assertions.assertThat(stackChild.topInset).isEqualTo(statusBarHeight + child4.topBar.height)
488
- }
489
-
490
- @Test
491
- fun bottomInset_defaultOptionsAreTakenIntoAccount() {
492
- val defaultOptions = Options()
493
- defaultOptions.bottomTabsOptions.visible = Bool(false)
494
- Java6Assertions.assertThat(uut.getBottomInset(child1)).isEqualTo(bottomTabs.height)
495
- uut.setDefaultOptions(defaultOptions)
496
- Java6Assertions.assertThat(uut.getBottomInset(child1)).isZero
497
- }
498
-
499
- @Test
500
- fun destroy() {
501
- uut.destroy()
502
- Mockito.verify(tabsAttacher).destroy()
503
- }
504
-
505
- private fun prepareViewsForTests(
506
- bottomTabsOptions: BottomTabsOptions = initialOptions.bottomTabsOptions,
507
- options: Options = initialOptions, defaultOptions: Options = initialOptions
508
- ) {
509
- if(::uut.isInitialized){
510
- uut.destroy()
511
- }
512
- // ObjectUtils.perform(uut, { obj: BottomTabsController -> obj.destroy() })
513
- bottomTabs = Mockito.spy(object : BottomTabs(activity) {
514
- override fun superCreateItems() {}
515
- })
516
- bottomTabsContainer = Mockito.spy(BottomTabsContainer(activity, bottomTabs))
517
- createChildren()
518
- tabs = mutableListOf(child1, child2, child3, child4, child5)
519
- defaultOptions.bottomTabsOptions = bottomTabsOptions
520
- presenter = Mockito.spy(BottomTabsPresenter(tabs, defaultOptions, BottomTabsAnimator()))
521
- bottomTabPresenter =
522
- Mockito.spy(BottomTabPresenter(activity, tabs, mock(), TypefaceLoaderMock(), defaultOptions))
523
- tabsAttacher = Mockito.spy(BottomTabsAttacher(tabs, presenter, defaultOptions))
524
- uut = createBottomTabs(options = options, defaultOptions = defaultOptions)
525
- activity.setContentView(FakeParentController(activity, childRegistry, uut).view)
526
- }
527
-
528
- private fun createChildren() {
529
- child1 = Mockito.spy(SimpleViewController(activity, childRegistry, "child1", tabOptions))
530
- child2 = Mockito.spy(SimpleViewController(activity, childRegistry, "child2", tabOptions))
531
- child3 = Mockito.spy(SimpleViewController(activity, childRegistry, "child3", tabOptions))
532
- stackChild = Mockito.spy(SimpleViewController(activity, childRegistry, "stackChild", tabOptions))
533
- child4 = spyOnStack(stackChild)
534
- child5 = Mockito.spy(SimpleViewController(activity, childRegistry, "child5", tabOptions))
535
- Mockito.`when`(child5.handleBack(any())).thenReturn(true)
536
- }
537
-
538
- private fun spyOnStack(initialChild: ViewController<*>?): StackController {
539
- val build = TestUtils.newStackController(activity)
540
- .setInitialOptions(tabOptions)
541
- .build()
542
- val stack = Mockito.spy(build)
543
- disablePushAnimation(initialChild)
544
- stack.ensureViewIsCreated()
545
- stack.push(initialChild, CommandListenerAdapter())
546
- return stack
547
- }
548
-
549
- private fun createBottomTabs(
550
- options: Options = initialOptions,
551
- defaultOptions: Options = initialOptions
552
- ): BottomTabsController {
553
- return object : BottomTabsController(
554
- activity,
555
- tabs,
556
- childRegistry,
557
- eventEmitter,
558
- imageLoaderMock,
559
- "uut",
560
- options,
561
- Presenter(activity, defaultOptions),
562
- tabsAttacher,
563
- presenter,
564
- bottomTabPresenter
565
- ) {
566
- override fun ensureViewIsCreated() {
567
- super.ensureViewIsCreated()
568
- uut.view.layout(0, 0, 1000, 1000)
569
- }
570
-
571
- override fun createView(): BottomTabsLayout {
572
- val view = super.createView()
573
- this@BottomTabsControllerTest.bottomTabs.layoutParams.height = 100
574
- return view
575
- }
576
-
577
- override fun createBottomTabsContainer(): BottomTabsContainer {
578
- return this@BottomTabsControllerTest.bottomTabsContainer
579
- }
580
-
581
- override fun createBottomTabs(): BottomTabs {
582
- return this@BottomTabsControllerTest.bottomTabs
583
- }
584
- }
585
- }
586
-
587
- private val statusBarHeight: Int
588
- get() = getStatusBarHeight(activity)
589
- }