1919import static com .google .common .truth .Truth .assertThat ;
2020import static org .junit .Assert .fail ;
2121
22+ import dagger .Component ;
23+ import dagger .Module ;
24+ import dagger .Provides ;
25+ import dagger .Reusable ;
26+ import javax .inject .Inject ;
2227import javax .inject .Provider ;
2328import org .junit .Test ;
2429import org .junit .runner .RunWith ;
2530import org .junit .runners .JUnit4 ;
2631
2732@ RunWith (JUnit4 .class )
2833public class NullabilityTest {
29- @ Test public void testNullability_provides () {
34+ @interface Nullable {}
35+
36+ @ Component (dependencies = NullComponent .class )
37+ interface NullComponentWithDependency {
38+ @ Nullable String string ();
39+ Number number ();
40+ Provider <String > stringProvider ();
41+ Provider <Number > numberProvider ();
42+ }
43+
44+ @ Component (modules = NullModule .class )
45+ interface NullComponent {
46+ @ Nullable String string ();
47+ @ Nullable Integer integer ();
48+ NullFoo nullFoo ();
49+ Number number ();
50+ Provider <String > stringProvider ();
51+ Provider <Number > numberProvider ();
52+ }
53+
54+ @ Module
55+ static class NullModule {
56+ Number numberValue = null ;
57+ Integer integerCallCount = 0 ;
58+
59+ @ Nullable
60+ @ Provides
61+ String provideNullableString () {
62+ return null ;
63+ }
64+
65+ @ Provides
66+ Number provideNumber () {
67+ return numberValue ;
68+ }
69+
70+ @ Nullable
71+ @ Provides
72+ @ Reusable
73+ Integer provideNullReusableInteger () {
74+ integerCallCount ++;
75+ return null ;
76+ }
77+ }
78+
79+ @ SuppressWarnings ("BadInject" ) // This is just for testing purposes.
80+ static class NullFoo {
81+ final String string ;
82+ final Number number ;
83+ final Provider <String > stringProvider ;
84+ final Provider <Number > numberProvider ;
85+
86+ @ Inject
87+ NullFoo (
88+ @ Nullable String string ,
89+ Number number ,
90+ Provider <String > stringProvider ,
91+ Provider <Number > numberProvider ) {
92+ this .string = string ;
93+ this .number = number ;
94+ this .stringProvider = stringProvider ;
95+ this .numberProvider = numberProvider ;
96+ }
97+
98+ String methodInjectedString ;
99+ Number methodInjectedNumber ;
100+ Provider <String > methodInjectedStringProvider ;
101+ Provider <Number > methodInjectedNumberProvider ;
102+ @ Inject void inject (
103+ @ Nullable String string ,
104+ Number number ,
105+ Provider <String > stringProvider ,
106+ Provider <Number > numberProvider ) {
107+ this .methodInjectedString = string ;
108+ this .methodInjectedNumber = number ;
109+ this .methodInjectedStringProvider = stringProvider ;
110+ this .methodInjectedNumberProvider = numberProvider ;
111+ }
112+
113+ @ Nullable @ Inject String fieldInjectedString ;
114+ @ Inject Number fieldInjectedNumber ;
115+ @ Inject Provider <String > fieldInjectedStringProvider ;
116+ @ Inject Provider <Number > fieldInjectedNumberProvider ;
117+ }
118+
119+ @ Test
120+ public void testNullability_provides () {
30121 NullModule module = new NullModule ();
31- NullComponent component = DaggerNullComponent .builder ().nullModule (module ).build ();
122+ NullComponent component =
123+ DaggerNullabilityTest_NullComponent .builder ().nullModule (module ).build ();
32124
33125 // Can't construct NullFoo because it depends on Number, and Number was null.
34126 try {
@@ -53,9 +145,11 @@ public class NullabilityTest {
53145 nullFoo .fieldInjectedNumberProvider );
54146 }
55147
56- @ Test public void testNullability_reusuable () {
148+ @ Test
149+ public void testNullability_reusuable () {
57150 NullModule module = new NullModule ();
58- NullComponent component = DaggerNullComponent .builder ().nullModule (module ).build ();
151+ NullComponent component =
152+ DaggerNullabilityTest_NullComponent .builder ().nullModule (module ).build ();
59153
60154 // Test that the @Nullable @Reusuable binding is cached properly even when the value is null.
61155 assertThat (module .integerCallCount ).isEqualTo (0 );
@@ -65,7 +159,8 @@ public class NullabilityTest {
65159 assertThat (module .integerCallCount ).isEqualTo (1 );
66160 }
67161
68- @ Test public void testNullability_components () {
162+ @ Test
163+ public void testNullability_components () {
69164 NullComponent nullComponent = new NullComponent () {
70165 @ Override public Provider <String > stringProvider () {
71166 return new Provider <String >() {
@@ -100,7 +195,9 @@ public class NullabilityTest {
100195 }
101196 };
102197 NullComponentWithDependency component =
103- DaggerNullComponentWithDependency .builder ().nullComponent (nullComponent ).build ();
198+ DaggerNullabilityTest_NullComponentWithDependency .builder ()
199+ .nullComponent (nullComponent )
200+ .build ();
104201 validate (false , component .string (), component .stringProvider (), component .numberProvider ());
105202
106203 // Also validate that the component's number() method fails
0 commit comments