Browse Source

Fix NPE when there are no default options

Guy Carmeli 5 years ago
parent
commit
fcdacbc8fc

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

1
 package com.reactnativenavigation.parse;
1
 package com.reactnativenavigation.parse;
2
 
2
 
3
 import android.app.Activity;
3
 import android.app.Activity;
4
+import android.support.annotation.NonNull;
5
+import android.support.annotation.RestrictTo;
4
 
6
 
5
 import com.facebook.react.ReactInstanceManager;
7
 import com.facebook.react.ReactInstanceManager;
6
 import com.reactnativenavigation.presentation.BottomTabPresenter;
8
 import com.reactnativenavigation.presentation.BottomTabPresenter;
11
 import com.reactnativenavigation.presentation.SideMenuPresenter;
13
 import com.reactnativenavigation.presentation.SideMenuPresenter;
12
 import com.reactnativenavigation.presentation.StackPresenter;
14
 import com.reactnativenavigation.presentation.StackPresenter;
13
 import com.reactnativenavigation.react.EventEmitter;
15
 import com.reactnativenavigation.react.EventEmitter;
16
+import com.reactnativenavigation.utils.Assertions;
14
 import com.reactnativenavigation.utils.ImageLoader;
17
 import com.reactnativenavigation.utils.ImageLoader;
15
 import com.reactnativenavigation.utils.TypefaceLoader;
18
 import com.reactnativenavigation.utils.TypefaceLoader;
16
 import com.reactnativenavigation.viewcontrollers.ChildControllersRegistry;
19
 import com.reactnativenavigation.viewcontrollers.ChildControllersRegistry;
37
 import static com.reactnativenavigation.parse.Options.parse;
40
 import static com.reactnativenavigation.parse.Options.parse;
38
 
41
 
39
 public class LayoutFactory {
42
 public class LayoutFactory {
40
-
41
 	private Activity activity;
43
 	private Activity activity;
42
     private ChildControllersRegistry childRegistry;
44
     private ChildControllersRegistry childRegistry;
43
 	private final ReactInstanceManager reactInstanceManager;
45
 	private final ReactInstanceManager reactInstanceManager;
44
     private EventEmitter eventEmitter;
46
     private EventEmitter eventEmitter;
45
     private Map<String, ExternalComponentCreator> externalComponentCreators;
47
     private Map<String, ExternalComponentCreator> externalComponentCreators;
46
-    private Options defaultOptions;
48
+    private @NonNull Options defaultOptions = new Options();
47
     private TypefaceLoader typefaceManager;
49
     private TypefaceLoader typefaceManager;
48
 
50
 
49
-    public void setDefaultOptions(Options defaultOptions) {
51
+    public void setDefaultOptions(@NonNull Options defaultOptions) {
52
+        Assertions.assertNotNull(defaultOptions);
50
         this.defaultOptions = defaultOptions;
53
         this.defaultOptions = defaultOptions;
51
     }
54
     }
52
 
55
 
225
         }
228
         }
226
         return new TopTabsController(activity, childRegistry, node.id, tabs, new TopTabsLayoutCreator(activity, tabs), parse(typefaceManager, node.getOptions()), new Presenter(activity, defaultOptions));
229
         return new TopTabsController(activity, childRegistry, node.id, tabs, new TopTabsLayoutCreator(activity, tabs), parse(typefaceManager, node.getOptions()), new Presenter(activity, defaultOptions));
227
     }
230
     }
231
+
232
+    @NonNull
233
+    @RestrictTo(RestrictTo.Scope.TESTS)
234
+    public Options getDefaultOptions() {
235
+        return defaultOptions;
236
+    }
228
 }
237
 }

+ 9
- 0
lib/android/app/src/main/java/com/reactnativenavigation/utils/Assertions.java View File

1
+package com.reactnativenavigation.utils;
2
+
3
+import javax.annotation.Nullable;
4
+
5
+public class Assertions {
6
+    public static void assertNotNull(@Nullable Object object) {
7
+        if (object == null) throw new AssertionError();
8
+    }
9
+}

+ 44
- 0
lib/android/app/src/test/java/com/reactnativenavigation/utils/LayoutFactoryTest.java View File

1
+package com.reactnativenavigation.utils;
2
+
3
+import com.facebook.react.ReactInstanceManager;
4
+import com.reactnativenavigation.BaseTest;
5
+import com.reactnativenavigation.parse.LayoutFactory;
6
+import com.reactnativenavigation.parse.LayoutNode;
7
+
8
+import org.json.JSONException;
9
+import org.json.JSONObject;
10
+import org.junit.Test;
11
+
12
+import static org.assertj.core.api.Java6Assertions.assertThat;
13
+import static org.mockito.Mockito.mock;
14
+
15
+public class LayoutFactoryTest extends BaseTest {
16
+    private LayoutFactory uut;
17
+
18
+    @Override
19
+    public void beforeEach() {
20
+        uut = new LayoutFactory(mock(ReactInstanceManager.class));
21
+    }
22
+
23
+    @Test
24
+    public void sanity() throws JSONException {
25
+        assertThat(uut.create(component())).isNotNull();
26
+    }
27
+
28
+    @Test
29
+    public void defaultOptionsAreNotNull() {
30
+        assertThat(uut.getDefaultOptions()).isNotNull();
31
+        boolean exceptionThrown = false;
32
+        try {
33
+            //noinspection ConstantConditions
34
+            uut.setDefaultOptions(null);
35
+        } catch (AssertionError error) {
36
+            exceptionThrown = true;
37
+        }
38
+        assertThat(exceptionThrown).isTrue();
39
+    }
40
+
41
+    private LayoutNode component() throws JSONException {
42
+        return new LayoutNode("Component1", LayoutNode.Type.Component, new JSONObject().put("name", "com.component"), null);
43
+    }
44
+}