Daniel Zlotin 7 lat temu
rodzic
commit
a6df80bcb1

+ 30
- 5
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/StackController.java Wyświetl plik

@@ -30,9 +30,11 @@ public class StackController extends ViewController {
30 30
 
31 31
 	public void push(final ViewController child) {
32 32
 		ViewController previousTop = peek();
33
+
33 34
 		child.setParentStackController(this);
34 35
 		childControllers.push(child);
35 36
 		getView().addView(child.getView());
37
+
36 38
 		if (previousTop != null) {
37 39
 			getView().removeView(previousTop.getView());
38 40
 		}
@@ -43,11 +45,21 @@ public class StackController extends ViewController {
43 45
 	}
44 46
 
45 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,4 +89,17 @@ public class StackController extends ViewController {
77 89
 	protected ViewGroup onCreateView() {
78 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 Wyświetl plik

@@ -6,12 +6,20 @@ import android.view.View;
6 6
 import com.reactnativenavigation.viewcontrollers.ViewController;
7 7
 
8 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 12
 		super(activity);
13
+		this.name = name;
11 14
 	}
12 15
 
13 16
 	@Override
14 17
 	protected View onCreateView() {
15 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 Wyświetl plik

@@ -24,9 +24,9 @@ public class StackControllerTest extends BaseTest {
24 24
 		super.beforeEach();
25 25
 		activity = newActivity();
26 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 32
 	@Test
@@ -38,24 +38,24 @@ public class StackControllerTest extends BaseTest {
38 38
 	public void holdsAStackOfViewControllers() throws Exception {
39 39
 		assertThat(uut.getChildControllers()).isEmpty();
40 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 45
 	@Test
46 46
 	public void push() throws Exception {
47 47
 		assertThat(uut.getChildControllers()).isEmpty();
48 48
 		uut.push(child1);
49
-		assertThat(uut.getChildControllers()).containsExactly(child1);
49
+		assertThat(uut.getChildControllers()).containsOnly(child1);
50 50
 	}
51 51
 
52 52
 	@Test
53 53
 	public void pop() throws Exception {
54 54
 		uut.push(child1);
55 55
 		uut.push(child2);
56
-		assertThat(uut.getChildControllers()).containsExactly(child2, child1);
56
+		assertThat(uut.getChildControllers()).containsOnly(child2, child1);
57 57
 		uut.pop();
58
-		assertThat(uut.getChildControllers()).containsExactly(child1);
58
+		assertThat(uut.getChildControllers()).containsOnly(child1);
59 59
 	}
60 60
 
61 61
 	@Test
@@ -98,24 +98,24 @@ public class StackControllerTest extends BaseTest {
98 98
 
99 99
 	@Test
100 100
 	public void popDoesNothingWhenZeroOrOneChild() throws Exception {
101
-		assertThat(uut.getChildControllers().size()).isZero();
101
+		assertThat(uut.getChildControllers()).isEmpty();
102 102
 		uut.pop();
103
-		assertThat(uut.getChildControllers().size()).isZero();
103
+		assertThat(uut.getChildControllers()).isEmpty();
104 104
 
105 105
 		uut.push(child1);
106 106
 		uut.pop();
107
-		assertThat(uut.getChildControllers().size()).isEqualTo(1);
107
+		assertThat(uut.getChildControllers()).containsOnly(child1);
108 108
 	}
109 109
 
110 110
 	@Test
111 111
 	public void canPopWhenSizeIsMoreThanOne() throws Exception {
112
-		assertThat(uut.getChildControllers().size()).isZero();
112
+		assertThat(uut.getChildControllers()).isEmpty();
113 113
 		assertThat(uut.canPop()).isFalse();
114 114
 		uut.push(child1);
115
-		assertThat(uut.getChildControllers().size()).isEqualTo(1);
115
+		assertThat(uut.getChildControllers()).containsOnly(child1);
116 116
 		assertThat(uut.canPop()).isFalse();
117 117
 		uut.push(child2);
118
-		assertThat(uut.getChildControllers().size()).isEqualTo(2);
118
+		assertThat(uut.getChildControllers()).containsOnly(child1, child2);
119 119
 		assertThat(uut.canPop()).isTrue();
120 120
 	}
121 121
 
@@ -131,26 +131,60 @@ public class StackControllerTest extends BaseTest {
131 131
 	public void pushAddsToViewTree() throws Exception {
132 132
 		assertThat(uut.getView().getChildCount()).isZero();
133 133
 		uut.push(child1);
134
-		assertThat(uut.getView().getChildCount()).isEqualTo(1);
134
+		assertHasSingleChildViewOfController(child1);
135 135
 	}
136 136
 
137 137
 	@Test
138 138
 	public void pushRemovesPreviousFromTree() throws Exception {
139 139
 		assertThat(uut.getView().getChildCount()).isZero();
140 140
 		uut.push(child1);
141
-		assertThat(uut.getView().getChildCount()).isEqualTo(1);
141
+		assertHasSingleChildViewOfController(child1);
142 142
 		uut.push(child2);
143
-		assertThat(uut.getView().getChildCount()).isEqualTo(1);
143
+		assertHasSingleChildViewOfController(child2);
144 144
 	}
145 145
 
146 146
 	@Test
147 147
 	public void popReplacesViewWithPrevious() throws Exception {
148 148
 		uut.push(child1);
149 149
 		uut.push(child2);
150
-		assertThat(uut.getView().getChildCount()).isEqualTo(1);
151
-		assertThat(uut.getView().getChildAt(0)).isEqualTo(child2.getView());
150
+		assertHasSingleChildViewOfController(child2);
152 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 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 Wyświetl plik

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