Browse Source

pop specific

Daniel Zlotin 7 years ago
parent
commit
a6df80bcb1

+ 30
- 5
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/StackController.java View File

30
 
30
 
31
 	public void push(final ViewController child) {
31
 	public void push(final ViewController child) {
32
 		ViewController previousTop = peek();
32
 		ViewController previousTop = peek();
33
+
33
 		child.setParentStackController(this);
34
 		child.setParentStackController(this);
34
 		childControllers.push(child);
35
 		childControllers.push(child);
35
 		getView().addView(child.getView());
36
 		getView().addView(child.getView());
37
+
36
 		if (previousTop != null) {
38
 		if (previousTop != null) {
37
 			getView().removeView(previousTop.getView());
39
 			getView().removeView(previousTop.getView());
38
 		}
40
 		}
43
 	}
45
 	}
44
 
46
 
45
 	public void pop() {
47
 	public void pop() {
46
-		if (canPop()) {
47
-			ViewController poppedController = childControllers.pop();
48
-			getView().removeView(poppedController.getView());
49
-			ViewController previousTop = peek();
50
-			getView().addView(previousTop.getView());
48
+		if (!canPop()) {
49
+			return;
50
+		}
51
+		ViewController poppedController = childControllers.pop();
52
+		getView().removeView(poppedController.getView());
53
+
54
+		ViewController previousTop = peek();
55
+		getView().addView(previousTop.getView());
56
+	}
57
+
58
+	public void pop(final ViewController childController) {
59
+		if (peek() == childController) {
60
+			pop();
61
+		} else {
62
+			childControllers.remove(childController);
51
 		}
63
 		}
52
 	}
64
 	}
53
 
65
 
77
 	protected ViewGroup onCreateView() {
89
 	protected ViewGroup onCreateView() {
78
 		return new FrameLayout(getActivity());
90
 		return new FrameLayout(getActivity());
79
 	}
91
 	}
92
+
93
+//	public ViewController getChildController(final int index) {
94
+//		Iterator<ViewController> it = childControllers.descendingIterator();
95
+//		int currentIndex = 0;
96
+//		while (it.hasNext()) {
97
+//			ViewController controller = it.next();
98
+//			if (currentIndex == index) {
99
+//				return controller;
100
+//			}
101
+//			currentIndex++;
102
+//		}
103
+//		return null;
104
+//	}
80
 }
105
 }

+ 9
- 1
lib/android/app/src/test/java/com/reactnativenavigation/mocks/SimpleViewController.java View File

6
 import com.reactnativenavigation.viewcontrollers.ViewController;
6
 import com.reactnativenavigation.viewcontrollers.ViewController;
7
 
7
 
8
 public class SimpleViewController extends ViewController {
8
 public class SimpleViewController extends ViewController {
9
-	public SimpleViewController(final Activity activity) {
9
+	private final String name;
10
+
11
+	public SimpleViewController(final Activity activity, String name) {
10
 		super(activity);
12
 		super(activity);
13
+		this.name = name;
11
 	}
14
 	}
12
 
15
 
13
 	@Override
16
 	@Override
14
 	protected View onCreateView() {
17
 	protected View onCreateView() {
15
 		return new View(getActivity());
18
 		return new View(getActivity());
16
 	}
19
 	}
20
+
21
+	@Override
22
+	public String toString() {
23
+		return "SimpleViewController " + name;
24
+	}
17
 }
25
 }

+ 54
- 20
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/StackControllerTest.java View File

24
 		super.beforeEach();
24
 		super.beforeEach();
25
 		activity = newActivity();
25
 		activity = newActivity();
26
 		uut = new StackController(activity);
26
 		uut = new StackController(activity);
27
-		child1 = new SimpleViewController(activity);
28
-		child2 = new SimpleViewController(activity);
29
-		child3 = new SimpleViewController(activity);
27
+		child1 = new SimpleViewController(activity, "child1");
28
+		child2 = new SimpleViewController(activity, "child2");
29
+		child3 = new SimpleViewController(activity, "child3");
30
 	}
30
 	}
31
 
31
 
32
 	@Test
32
 	@Test
38
 	public void holdsAStackOfViewControllers() throws Exception {
38
 	public void holdsAStackOfViewControllers() throws Exception {
39
 		assertThat(uut.getChildControllers()).isEmpty();
39
 		assertThat(uut.getChildControllers()).isEmpty();
40
 		uut.setChildControllers(child1, child2, child3);
40
 		uut.setChildControllers(child1, child2, child3);
41
-		assertThat(uut.getChildControllers()).containsExactly(child3, child2, child1);
42
-		assertThat(uut.getChildControllers().peek()).isEqualTo(child3);
41
+		assertThat(uut.getChildControllers()).containsOnly(child3, child2, child1);
42
+		assertThat(uut.peek()).isEqualTo(child3);
43
 	}
43
 	}
44
 
44
 
45
 	@Test
45
 	@Test
46
 	public void push() throws Exception {
46
 	public void push() throws Exception {
47
 		assertThat(uut.getChildControllers()).isEmpty();
47
 		assertThat(uut.getChildControllers()).isEmpty();
48
 		uut.push(child1);
48
 		uut.push(child1);
49
-		assertThat(uut.getChildControllers()).containsExactly(child1);
49
+		assertThat(uut.getChildControllers()).containsOnly(child1);
50
 	}
50
 	}
51
 
51
 
52
 	@Test
52
 	@Test
53
 	public void pop() throws Exception {
53
 	public void pop() throws Exception {
54
 		uut.push(child1);
54
 		uut.push(child1);
55
 		uut.push(child2);
55
 		uut.push(child2);
56
-		assertThat(uut.getChildControllers()).containsExactly(child2, child1);
56
+		assertThat(uut.getChildControllers()).containsOnly(child2, child1);
57
 		uut.pop();
57
 		uut.pop();
58
-		assertThat(uut.getChildControllers()).containsExactly(child1);
58
+		assertThat(uut.getChildControllers()).containsOnly(child1);
59
 	}
59
 	}
60
 
60
 
61
 	@Test
61
 	@Test
98
 
98
 
99
 	@Test
99
 	@Test
100
 	public void popDoesNothingWhenZeroOrOneChild() throws Exception {
100
 	public void popDoesNothingWhenZeroOrOneChild() throws Exception {
101
-		assertThat(uut.getChildControllers().size()).isZero();
101
+		assertThat(uut.getChildControllers()).isEmpty();
102
 		uut.pop();
102
 		uut.pop();
103
-		assertThat(uut.getChildControllers().size()).isZero();
103
+		assertThat(uut.getChildControllers()).isEmpty();
104
 
104
 
105
 		uut.push(child1);
105
 		uut.push(child1);
106
 		uut.pop();
106
 		uut.pop();
107
-		assertThat(uut.getChildControllers().size()).isEqualTo(1);
107
+		assertThat(uut.getChildControllers()).containsOnly(child1);
108
 	}
108
 	}
109
 
109
 
110
 	@Test
110
 	@Test
111
 	public void canPopWhenSizeIsMoreThanOne() throws Exception {
111
 	public void canPopWhenSizeIsMoreThanOne() throws Exception {
112
-		assertThat(uut.getChildControllers().size()).isZero();
112
+		assertThat(uut.getChildControllers()).isEmpty();
113
 		assertThat(uut.canPop()).isFalse();
113
 		assertThat(uut.canPop()).isFalse();
114
 		uut.push(child1);
114
 		uut.push(child1);
115
-		assertThat(uut.getChildControllers().size()).isEqualTo(1);
115
+		assertThat(uut.getChildControllers()).containsOnly(child1);
116
 		assertThat(uut.canPop()).isFalse();
116
 		assertThat(uut.canPop()).isFalse();
117
 		uut.push(child2);
117
 		uut.push(child2);
118
-		assertThat(uut.getChildControllers().size()).isEqualTo(2);
118
+		assertThat(uut.getChildControllers()).containsOnly(child1, child2);
119
 		assertThat(uut.canPop()).isTrue();
119
 		assertThat(uut.canPop()).isTrue();
120
 	}
120
 	}
121
 
121
 
131
 	public void pushAddsToViewTree() throws Exception {
131
 	public void pushAddsToViewTree() throws Exception {
132
 		assertThat(uut.getView().getChildCount()).isZero();
132
 		assertThat(uut.getView().getChildCount()).isZero();
133
 		uut.push(child1);
133
 		uut.push(child1);
134
-		assertThat(uut.getView().getChildCount()).isEqualTo(1);
134
+		assertHasSingleChildViewOfController(child1);
135
 	}
135
 	}
136
 
136
 
137
 	@Test
137
 	@Test
138
 	public void pushRemovesPreviousFromTree() throws Exception {
138
 	public void pushRemovesPreviousFromTree() throws Exception {
139
 		assertThat(uut.getView().getChildCount()).isZero();
139
 		assertThat(uut.getView().getChildCount()).isZero();
140
 		uut.push(child1);
140
 		uut.push(child1);
141
-		assertThat(uut.getView().getChildCount()).isEqualTo(1);
141
+		assertHasSingleChildViewOfController(child1);
142
 		uut.push(child2);
142
 		uut.push(child2);
143
-		assertThat(uut.getView().getChildCount()).isEqualTo(1);
143
+		assertHasSingleChildViewOfController(child2);
144
 	}
144
 	}
145
 
145
 
146
 	@Test
146
 	@Test
147
 	public void popReplacesViewWithPrevious() throws Exception {
147
 	public void popReplacesViewWithPrevious() throws Exception {
148
 		uut.push(child1);
148
 		uut.push(child1);
149
 		uut.push(child2);
149
 		uut.push(child2);
150
-		assertThat(uut.getView().getChildCount()).isEqualTo(1);
151
-		assertThat(uut.getView().getChildAt(0)).isEqualTo(child2.getView());
150
+		assertHasSingleChildViewOfController(child2);
152
 		uut.pop();
151
 		uut.pop();
152
+		assertHasSingleChildViewOfController(child1);
153
+	}
154
+
155
+	@Test
156
+	public void popSpecificWhenTopIsRegularPop() throws Exception {
157
+		uut.push(child1);
158
+		uut.push(child2);
159
+		uut.pop(child2);
160
+		assertThat(uut.getChildControllers()).containsOnly(child1);
161
+		assertHasSingleChildViewOfController(child1);
162
+	}
163
+
164
+	@Test
165
+	public void popSpecificDeepInStack() throws Exception {
166
+		uut.push(child1);
167
+		uut.push(child2);
168
+		assertHasSingleChildViewOfController(child2);
169
+
170
+		uut.pop(child1);
171
+		assertThat(uut.getChildControllers()).containsOnly(child2);
172
+		assertHasSingleChildViewOfController(child2);
173
+	}
174
+
175
+//	@Test
176
+//	public void getControllerAtIndex() throws Exception {
177
+//		uut.push(child1);
178
+//		uut.push(child2);
179
+//		uut.push(child3);
180
+//		assertThat(uut.getChildController(0)).isEqualTo(child1);
181
+//		assertThat(uut.getChildController(1)).isEqualTo(child2);
182
+//		assertThat(uut.getChildController(2)).isEqualTo(child3);
183
+//		assertThat(uut.getChildController(3)).isNull();
184
+//	}
185
+
186
+	private void assertHasSingleChildViewOfController(ViewController childController) {
153
 		assertThat(uut.getView().getChildCount()).isEqualTo(1);
187
 		assertThat(uut.getView().getChildCount()).isEqualTo(1);
154
-		assertThat(uut.getView().getChildAt(0)).isEqualTo(child1.getView());
188
+		assertThat(uut.getView().getChildAt(0)).isEqualTo(childController.getView());
155
 	}
189
 	}
156
 }
190
 }

+ 1
- 1
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/ViewControllerTest.java View File

19
 	public void beforeEach() {
19
 	public void beforeEach() {
20
 		super.beforeEach();
20
 		super.beforeEach();
21
 		activity = newActivity();
21
 		activity = newActivity();
22
-		uut = new SimpleViewController(activity);
22
+		uut = new SimpleViewController(activity, "uut");
23
 	}
23
 	}
24
 
24
 
25
 	@Test
25
 	@Test