react-native-navigation的迁移库

LayoutFactoryTest.java 9.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. package com.reactnativenavigation;
  2. import android.app.Activity;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. import com.reactnativenavigation.layout.Container;
  7. import com.reactnativenavigation.layout.ContainerStackLayout;
  8. import com.reactnativenavigation.layout.LayoutFactory;
  9. import com.reactnativenavigation.layout.LayoutNode;
  10. import com.reactnativenavigation.layout.SideMenuLayout;
  11. import com.reactnativenavigation.layout.bottomtabs.BottomTabs;
  12. import com.reactnativenavigation.layout.bottomtabs.BottomTabsCreator;
  13. import com.reactnativenavigation.layout.bottomtabs.BottomTabsLayout;
  14. import org.junit.Before;
  15. import org.junit.Test;
  16. import org.junit.runner.RunWith;
  17. import org.robolectric.Robolectric;
  18. import org.robolectric.RobolectricTestRunner;
  19. import java.util.Arrays;
  20. import java.util.Collections;
  21. import java.util.HashMap;
  22. import java.util.List;
  23. import static org.assertj.core.api.Java6Assertions.assertThat;
  24. import static org.mockito.ArgumentMatchers.eq;
  25. import static org.mockito.Mockito.mock;
  26. import static org.mockito.Mockito.verify;
  27. import static org.mockito.Mockito.when;
  28. @RunWith(RobolectricTestRunner.class)
  29. public class LayoutFactoryTest {
  30. private final static String NODE_ID = "myUniqueId";
  31. private final static String REACT_ROOT_VIEW_KEY = "myName";
  32. private final static String OTHER_NODE_ID = "anotherUniqueId";
  33. private final static String OTHER_REACT_ROOT_VIEW_KEY = "anotherName";
  34. private Activity activity;
  35. private View mockView;
  36. private View otherMockView;
  37. private LayoutFactory.ReactRootViewCreator reactRootViewCreator;
  38. @Before
  39. public void setUp() {
  40. activity = Robolectric.buildActivity(AppCompatActivity.class).get();
  41. mockView = new View(activity);
  42. otherMockView = new View(activity);
  43. reactRootViewCreator = mock(LayoutFactory.ReactRootViewCreator.class);
  44. }
  45. @Test
  46. public void returnsContainerThatHoldsTheRootView() throws Exception {
  47. when(reactRootViewCreator.create(eq(NODE_ID), eq(REACT_ROOT_VIEW_KEY))).thenReturn(mockView);
  48. final LayoutNode node = createContainerNode();
  49. final ViewGroup result = (ViewGroup) createLayoutFactory().create(node);
  50. assertThat(result).isInstanceOf(Container.class);
  51. TestUtils.assertViewChildren(result, mockView);
  52. }
  53. @Test
  54. public void returnsContainerStack() throws Exception {
  55. when(reactRootViewCreator.create(eq(NODE_ID), eq(REACT_ROOT_VIEW_KEY))).thenReturn(mockView);
  56. final LayoutNode containerNode = createContainerNode();
  57. final LayoutNode stackNode = createContainerStackNode(containerNode);
  58. final ViewGroup result = (ViewGroup) createLayoutFactory().create(stackNode);
  59. assertThat(result).isInstanceOf(ContainerStackLayout.class);
  60. ViewGroup container = (ViewGroup) TestUtils.assertViewChildrenCount(result, 1).get(0);
  61. TestUtils.assertViewChildren(container, mockView);
  62. }
  63. @Test
  64. public void returnsContainerStackWithMultipleViews() throws Exception {
  65. final View mockView1 = mock(View.class);
  66. final View mockView2 = mock(View.class);
  67. when(reactRootViewCreator.create(eq(NODE_ID), eq(REACT_ROOT_VIEW_KEY))).thenReturn(mockView1);
  68. when(reactRootViewCreator.create(eq(OTHER_NODE_ID), eq(OTHER_REACT_ROOT_VIEW_KEY))).thenReturn(mockView2);
  69. final LayoutNode containerNode1 = createContainerNode(NODE_ID, REACT_ROOT_VIEW_KEY);
  70. final LayoutNode containerNode2 = createContainerNode(OTHER_NODE_ID, OTHER_REACT_ROOT_VIEW_KEY);
  71. final LayoutNode stackNode = createContainerStackNode(containerNode1, containerNode2);
  72. final ViewGroup result = (ViewGroup) createLayoutFactory().create(stackNode);
  73. assertThat(result).isInstanceOf(ContainerStackLayout.class);
  74. List<View> containers = TestUtils.assertViewChildrenCount(result, 2);
  75. ViewGroup container1 = (ViewGroup) containers.get(0);
  76. ViewGroup container2 = (ViewGroup) containers.get(1);
  77. TestUtils.assertViewChildren(container1, mockView1);
  78. TestUtils.assertViewChildren(container2, mockView2);
  79. }
  80. @Test
  81. public void returnsSideMenuRoot() throws Exception {
  82. when(reactRootViewCreator.create(eq(NODE_ID), eq(REACT_ROOT_VIEW_KEY))).thenReturn(mockView);
  83. final LayoutNode containerNode = createSideMenuContainerNode(Arrays.asList(createContainerNode()));
  84. final ViewGroup result = (ViewGroup) createLayoutFactory().create(containerNode);
  85. assertThat(result).isInstanceOf(SideMenuLayout.class);
  86. }
  87. @Test
  88. public void hasContentContainer() throws Exception {
  89. when(reactRootViewCreator.create(eq(NODE_ID), eq(REACT_ROOT_VIEW_KEY))).thenReturn(mockView);
  90. LayoutNode contentContainer = createContainerNode();
  91. final LayoutNode sideMenu = createSideMenuContainerNode(Arrays.asList(contentContainer));
  92. final ViewGroup result = (ViewGroup) createLayoutFactory().create(sideMenu);
  93. assertThat(result.getChildAt(0)).isInstanceOf(Container.class);
  94. }
  95. @Test
  96. public void hasLeftMenu() throws Exception {
  97. when(reactRootViewCreator.create(eq(NODE_ID), eq(REACT_ROOT_VIEW_KEY))).thenReturn(mockView);
  98. LayoutNode sideMenuLeft = createSideMenuLeftNode();
  99. final LayoutNode sideMenu = createSideMenuContainerNode(Arrays.asList(sideMenuLeft));
  100. final ViewGroup result = (ViewGroup) createLayoutFactory().create(sideMenu);
  101. assertThat(result.getChildAt(0)).isInstanceOf(Container.class);
  102. }
  103. @Test
  104. public void hasRightMenu() throws Exception {
  105. when(reactRootViewCreator.create(eq(NODE_ID), eq(REACT_ROOT_VIEW_KEY))).thenReturn(mockView);
  106. LayoutNode sideMenuRight = createSideMenuRightNode();
  107. final LayoutNode sideMenu = createSideMenuContainerNode(Arrays.asList(sideMenuRight));
  108. final ViewGroup result = (ViewGroup) createLayoutFactory().create(sideMenu);
  109. assertThat(result.getChildAt(0)).isInstanceOf(Container.class);
  110. }
  111. @Test
  112. public void returnsSingleTabContent() throws Exception {
  113. BottomTabs bottomTabsMock = mock(BottomTabs.class);
  114. when(bottomTabsMock.size()).thenReturn(0);
  115. when(reactRootViewCreator.create(eq(NODE_ID), eq(REACT_ROOT_VIEW_KEY))).thenReturn(mockView);
  116. final LayoutNode containerNode = createContainerNode();
  117. final LayoutNode tabNode = createBottomTabNode(containerNode);
  118. final View result = createLayoutFactory(bottomTabsMock).create(tabNode);
  119. verify(bottomTabsMock).add("#0");
  120. assertThat(result).isInstanceOf(BottomTabsLayout.class);
  121. Container container = (Container) TestUtils.assertViewChildrenCount((BottomTabsLayout) result, 1).get(0);
  122. View view = TestUtils.assertViewChildrenCount(container, 1).get(0);
  123. assertThat(view).isEqualTo(mockView);
  124. }
  125. @Test
  126. public void returnsTwoTabContent() throws Exception {
  127. BottomTabs bottomTabsMock = mock(BottomTabs.class);
  128. when(bottomTabsMock.size()).thenReturn(0, 1);
  129. when(reactRootViewCreator.create(eq(NODE_ID), eq(REACT_ROOT_VIEW_KEY))).thenReturn(mockView);
  130. final LayoutNode firstTabRootNode = createContainerNode(NODE_ID, REACT_ROOT_VIEW_KEY);
  131. when(reactRootViewCreator.create(eq(OTHER_NODE_ID), eq(OTHER_REACT_ROOT_VIEW_KEY))).thenReturn(otherMockView);
  132. final LayoutNode secondTabRootNode = createContainerStackNode(createContainerNode(OTHER_NODE_ID, OTHER_REACT_ROOT_VIEW_KEY));
  133. final LayoutNode tabNode = createBottomTabNode(firstTabRootNode, secondTabRootNode);
  134. final View result = createLayoutFactory(bottomTabsMock).create(tabNode);
  135. assertThat(result).isInstanceOf(BottomTabsLayout.class);
  136. verify(bottomTabsMock).add(eq("#0"));
  137. verify(bottomTabsMock).add(eq("#1"));
  138. }
  139. @Test(expected = IllegalArgumentException.class)
  140. public void throwsExceptionForUnknownType() throws Exception {
  141. when(reactRootViewCreator.create(eq(NODE_ID), eq(REACT_ROOT_VIEW_KEY))).thenReturn(mockView);
  142. final LayoutNode node = new LayoutNode(NODE_ID, "***unknownType***", Collections.<String, Object>emptyMap());
  143. createLayoutFactory().create(node);
  144. }
  145. private LayoutFactory createLayoutFactory() {
  146. return createLayoutFactory(null);
  147. }
  148. private LayoutFactory createLayoutFactory(BottomTabs bottomTabs) {
  149. BottomTabsCreator bottomTabsCreator = null;
  150. if (bottomTabs != null) {
  151. bottomTabsCreator = mock(BottomTabsCreator.class);
  152. when(bottomTabsCreator.create()).thenReturn(bottomTabs);
  153. }
  154. return new LayoutFactory(activity, reactRootViewCreator, bottomTabsCreator);
  155. }
  156. private LayoutNode createContainerNode() {
  157. return createContainerNode(NODE_ID, REACT_ROOT_VIEW_KEY);
  158. }
  159. private LayoutNode createSideMenuLeftNode() {
  160. List<LayoutNode> children = Arrays.asList(createContainerNode());
  161. return new LayoutNode("SideMenuLeft", children);
  162. }
  163. private LayoutNode createSideMenuRightNode() {
  164. List<LayoutNode> children = Arrays.asList(createContainerNode());
  165. return new LayoutNode("SideMenuRight", children);
  166. }
  167. private LayoutNode createContainerNode(final String id, final String name) {
  168. return new LayoutNode(id, "Container", new HashMap<String, Object>() {{ put("name", name); }});
  169. }
  170. private LayoutNode createSideMenuContainerNode(List<LayoutNode> children) {
  171. return new LayoutNode("SideMenuRoot", children);
  172. }
  173. private LayoutNode createContainerStackNode(LayoutNode... children) {
  174. return new LayoutNode("ContainerStack", Arrays.asList(children));
  175. }
  176. private LayoutNode createBottomTabNode(LayoutNode... children) {
  177. return new LayoutNode("BottomTabs", Arrays.asList(children));
  178. }
  179. }