Browse Source

test driven refactoring

Daniel Zlotin 7 years ago
parent
commit
165511ddc4

+ 2
- 8
lib/android/app/src/main/java/com/reactnativenavigation/parse/LayoutFactory.java View File

3
 import android.app.Activity;
3
 import android.app.Activity;
4
 
4
 
5
 import com.facebook.react.ReactInstanceManager;
5
 import com.facebook.react.ReactInstanceManager;
6
-import com.reactnativenavigation.react.ReactContainerView;
6
+import com.reactnativenavigation.react.ReactContainerViewCreator;
7
 import com.reactnativenavigation.viewcontrollers.BottomTabsController;
7
 import com.reactnativenavigation.viewcontrollers.BottomTabsController;
8
 import com.reactnativenavigation.viewcontrollers.ContainerViewController;
8
 import com.reactnativenavigation.viewcontrollers.ContainerViewController;
9
 import com.reactnativenavigation.viewcontrollers.SideMenuController;
9
 import com.reactnativenavigation.viewcontrollers.SideMenuController;
81
 		String id = node.id;
81
 		String id = node.id;
82
 		String name = node.data.optString("name");
82
 		String name = node.data.optString("name");
83
 		NavigationOptions navigationOptions = NavigationOptions.parse(node.data.optJSONObject("navigationOptions"));
83
 		NavigationOptions navigationOptions = NavigationOptions.parse(node.data.optJSONObject("navigationOptions"));
84
-		ContainerViewController.ContainerViewCreator viewCreator = new ContainerViewController.ContainerViewCreator() {
85
-			@Override
86
-			public ContainerViewController.ContainerView create(final Activity activity, final String containerId, final String containerName) {
87
-				return new ReactContainerView(activity, reactInstanceManager, containerId, containerName);
88
-			}
89
-		};
90
-		return new ContainerViewController(activity, id, name, viewCreator, navigationOptions);
84
+		return new ContainerViewController(activity, id, name, new ReactContainerViewCreator(reactInstanceManager), navigationOptions);
91
 	}
85
 	}
92
 
86
 
93
 	private ViewController createContainerStack(LayoutNode node) {
87
 	private ViewController createContainerStack(LayoutNode node) {

+ 4
- 0
lib/android/app/src/main/java/com/reactnativenavigation/parse/NavigationOptions.java View File

19
 
19
 
20
 	public String title = "";
20
 	public String title = "";
21
 	public int topBarBackgroundColor = 0;
21
 	public int topBarBackgroundColor = 0;
22
+
23
+	public void mergeWith(final NavigationOptions other) {
24
+		title = other.title;
25
+	}
22
 }
26
 }

+ 3
- 3
lib/android/app/src/main/java/com/reactnativenavigation/react/ReactContainerView.java View File

13
 	private final ReactInstanceManager reactInstanceManager;
13
 	private final ReactInstanceManager reactInstanceManager;
14
 	private final String containerId;
14
 	private final String containerId;
15
 	private final String containerName;
15
 	private final String containerName;
16
-	private boolean attachedToReactInstance = false;
16
+	private boolean isAttachedToReactInstance = false;
17
 
17
 
18
 	public ReactContainerView(final Context context, ReactInstanceManager reactInstanceManager, String containerId, String containerName) {
18
 	public ReactContainerView(final Context context, ReactInstanceManager reactInstanceManager, String containerId, String containerName) {
19
 		super(context);
19
 		super(context);
29
 			@Override
29
 			@Override
30
 			public void onAttachedToReactInstance(final ReactRootView reactRootView) {
30
 			public void onAttachedToReactInstance(final ReactRootView reactRootView) {
31
 				reactRootView.setEventListener(null);
31
 				reactRootView.setEventListener(null);
32
-				attachedToReactInstance = true;
32
+				isAttachedToReactInstance = true;
33
 			}
33
 			}
34
 		});
34
 		});
35
 		final Bundle opts = new Bundle();
35
 		final Bundle opts = new Bundle();
39
 
39
 
40
 	@Override
40
 	@Override
41
 	public boolean isReady() {
41
 	public boolean isReady() {
42
-		return attachedToReactInstance;
42
+		return isAttachedToReactInstance;
43
 	}
43
 	}
44
 
44
 
45
 	@Override
45
 	@Override

+ 20
- 0
lib/android/app/src/main/java/com/reactnativenavigation/react/ReactContainerViewCreator.java View File

1
+package com.reactnativenavigation.react;
2
+
3
+import android.app.Activity;
4
+
5
+import com.facebook.react.ReactInstanceManager;
6
+import com.reactnativenavigation.viewcontrollers.ContainerViewController;
7
+import com.reactnativenavigation.viewcontrollers.ContainerViewController.ContainerViewCreator;
8
+
9
+public class ReactContainerViewCreator implements ContainerViewCreator {
10
+	private ReactInstanceManager reactInstanceManager;
11
+
12
+	public ReactContainerViewCreator(final ReactInstanceManager reactInstanceManager) {
13
+		this.reactInstanceManager = reactInstanceManager;
14
+	}
15
+
16
+	@Override
17
+	public ContainerViewController.ContainerView create(final Activity activity, final String containerId, final String containerName) {
18
+		return new ReactContainerView(activity, reactInstanceManager, containerId, containerName);
19
+	}
20
+}

+ 14
- 3
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/ContainerViewController.java View File

9
 public class ContainerViewController extends ViewController {
9
 public class ContainerViewController extends ViewController {
10
 
10
 
11
 	public interface ContainerViewCreator {
11
 	public interface ContainerViewCreator {
12
+
12
 		ContainerView create(Activity activity, String containerId, String containerName);
13
 		ContainerView create(Activity activity, String containerId, String containerName);
13
 	}
14
 	}
14
 
15
 
15
 	public interface ContainerView {
16
 	public interface ContainerView {
17
+
16
 		boolean isReady();
18
 		boolean isReady();
17
 
19
 
18
 		View asView();
20
 		View asView();
22
 		void sendContainerStart();
24
 		void sendContainerStart();
23
 
25
 
24
 		void sendContainerStop();
26
 		void sendContainerStop();
27
+
25
 	}
28
 	}
26
 
29
 
27
 	private final String containerName;
30
 	private final String containerName;
28
-	private final ContainerViewCreator viewCreator;
29
-	private final NavigationOptions initialNavigationOptions;
30
 
31
 
32
+	private final ContainerViewCreator viewCreator;
33
+	private final NavigationOptions navigationOptions;
31
 	private ContainerView containerView;
34
 	private ContainerView containerView;
32
 
35
 
33
 	public ContainerViewController(final Activity activity,
36
 	public ContainerViewController(final Activity activity,
38
 		super(activity, id);
41
 		super(activity, id);
39
 		this.containerName = containerName;
42
 		this.containerName = containerName;
40
 		this.viewCreator = viewCreator;
43
 		this.viewCreator = viewCreator;
41
-		this.initialNavigationOptions = initialNavigationOptions;
44
+		this.navigationOptions = initialNavigationOptions;
42
 	}
45
 	}
43
 
46
 
44
 	@Override
47
 	@Override
71
 		containerView = viewCreator.create(getActivity(), getId(), containerName);
74
 		containerView = viewCreator.create(getActivity(), getId(), containerName);
72
 		return containerView.asView();
75
 		return containerView.asView();
73
 	}
76
 	}
77
+
78
+	public void applyNavigationOptions(final NavigationOptions options) {
79
+		navigationOptions.mergeWith(options);
80
+	}
81
+
82
+	public NavigationOptions getNavigationOptions() {
83
+		return navigationOptions;
84
+	}
74
 }
85
 }

+ 4
- 4
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/Navigator.java View File

57
 	}
57
 	}
58
 
58
 
59
 	public void setOptions(final String containerId, NavigationOptions options) {
59
 	public void setOptions(final String containerId, NavigationOptions options) {
60
-//		ViewController target = findControllerById(containerId);
61
-//		if (target != null) {
62
-//			target.applyNavigationOptions(options);
63
-//		}
60
+		ViewController target = findControllerById(containerId);
61
+		if (target instanceof ContainerViewController) {
62
+			((ContainerViewController) target).applyNavigationOptions(options);
63
+		}
64
 	}
64
 	}
65
 
65
 
66
 	public void push(final String fromId, final ViewController viewController) {
66
 	public void push(final String fromId, final ViewController viewController) {

+ 37
- 0
lib/android/app/src/test/java/com/reactnativenavigation/mocks/TestContainerView.java View File

1
+package com.reactnativenavigation.mocks;
2
+
3
+import android.content.Context;
4
+import android.view.View;
5
+
6
+import com.reactnativenavigation.viewcontrollers.ContainerViewController;
7
+
8
+public class TestContainerView extends View implements ContainerViewController.ContainerView {
9
+	public TestContainerView(final Context context) {
10
+		super(context);
11
+	}
12
+
13
+	@Override
14
+	public boolean isReady() {
15
+		return false;
16
+	}
17
+
18
+	@Override
19
+	public View asView() {
20
+		return this;
21
+	}
22
+
23
+	@Override
24
+	public void destroy() {
25
+
26
+	}
27
+
28
+	@Override
29
+	public void sendContainerStart() {
30
+
31
+	}
32
+
33
+	@Override
34
+	public void sendContainerStop() {
35
+
36
+	}
37
+}

+ 13
- 0
lib/android/app/src/test/java/com/reactnativenavigation/mocks/TestContainerViewCreator.java View File

1
+package com.reactnativenavigation.mocks;
2
+
3
+import android.app.Activity;
4
+
5
+import com.reactnativenavigation.viewcontrollers.ContainerViewController;
6
+import com.reactnativenavigation.viewcontrollers.ContainerViewController.ContainerViewCreator;
7
+
8
+public class TestContainerViewCreator implements ContainerViewCreator {
9
+	@Override
10
+	public ContainerViewController.ContainerView create(final Activity activity, final String containerId, final String containerName) {
11
+		return new TestContainerView(activity);
12
+	}
13
+}

+ 16
- 6
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/NavigatorTest.java View File

4
 import android.support.annotation.NonNull;
4
 import android.support.annotation.NonNull;
5
 
5
 
6
 import com.reactnativenavigation.BaseTest;
6
 import com.reactnativenavigation.BaseTest;
7
-import com.reactnativenavigation.parse.NavigationOptions;
8
 import com.reactnativenavigation.mocks.SimpleViewController;
7
 import com.reactnativenavigation.mocks.SimpleViewController;
8
+import com.reactnativenavigation.mocks.TestContainerViewCreator;
9
 import com.reactnativenavigation.mocks.TestStackAnimator;
9
 import com.reactnativenavigation.mocks.TestStackAnimator;
10
+import com.reactnativenavigation.parse.NavigationOptions;
10
 import com.reactnativenavigation.utils.CompatUtils;
11
 import com.reactnativenavigation.utils.CompatUtils;
11
 
12
 
12
-import org.junit.Ignore;
13
 import org.junit.Test;
13
 import org.junit.Test;
14
 
14
 
15
 import java.util.Arrays;
15
 import java.util.Arrays;
190
 	}
190
 	}
191
 
191
 
192
 	@Test
192
 	@Test
193
-	@Ignore
194
 	public void setOptions_CallsApplyNavigationOptions() {
193
 	public void setOptions_CallsApplyNavigationOptions() {
195
-		uut.setRoot(child1);
194
+		ContainerViewController containerVc = new ContainerViewController(activity, "theId", "theName", new TestContainerViewCreator(), new NavigationOptions());
195
+		uut.setRoot(containerVc);
196
+		assertThat(containerVc.getNavigationOptions().title).isEmpty();
197
+
196
 		NavigationOptions options = new NavigationOptions();
198
 		NavigationOptions options = new NavigationOptions();
197
-		uut.setOptions(child1.getId(), options);
198
-//		assertThat(child1.getNavigationOptions()).isEqualTo(options);
199
+		options.title = "new title";
200
+
201
+		uut.setOptions("theId", options);
202
+		assertThat(containerVc.getNavigationOptions().title).isEqualTo("new title");
203
+	}
204
+
205
+	@Test
206
+	public void setOptions_AffectsOnlyContainerViewControllers() {
207
+		uut.setRoot(child1);
208
+		uut.setOptions(child1.getId(), new NavigationOptions());
199
 	}
209
 	}
200
 
210
 
201
 	@NonNull
211
 	@NonNull