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