blob: 37d3d616d2015b15f5ddc871d9404c0d9a905bce [file] [log] [blame]
/*
* Copyright (C) 2017 The Dagger Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dagger.android;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.fail;
import android.app.Activity;
import com.google.common.collect.ImmutableMap;
import dagger.android.AndroidInjector.Factory;
import dagger.android.DispatchingAndroidInjector.InvalidInjectorBindingException;
import java.util.Map;
import javax.inject.Provider;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
@RunWith(RobolectricTestRunner.class)
public final class DispatchingAndroidInjectorTest {
@Test
public void withClassKeys() {
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector =
newDispatchingAndroidInjector(
ImmutableMap.of(FooActivity.class, FooInjector.Factory::new), ImmutableMap.of());
FooActivity activity = Robolectric.setupActivity(FooActivity.class);
assertThat(dispatchingAndroidInjector.maybeInject(activity)).isTrue();
}
@Test
public void withStringKeys() {
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector =
newDispatchingAndroidInjector(
ImmutableMap.of(),
ImmutableMap.of(FooActivity.class.getName(), FooInjector.Factory::new));
FooActivity activity = Robolectric.setupActivity(FooActivity.class);
assertThat(dispatchingAndroidInjector.maybeInject(activity)).isTrue();
}
@Test
public void withMixedKeys() {
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector =
newDispatchingAndroidInjector(
ImmutableMap.of(FooActivity.class, FooInjector.Factory::new),
ImmutableMap.of(BarActivity.class.getName(), BarInjector.Factory::new));
FooActivity fooActivity = Robolectric.setupActivity(FooActivity.class);
assertThat(dispatchingAndroidInjector.maybeInject(fooActivity)).isTrue();
BarActivity barActivity = Robolectric.setupActivity(BarActivity.class);
assertThat(dispatchingAndroidInjector.maybeInject(barActivity)).isTrue();
}
@Test
public void maybeInject_returnsFalse_ifNoMatchingInjectorExists() {
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector =
newDispatchingAndroidInjector(ImmutableMap.of(), ImmutableMap.of());
BarActivity activity = Robolectric.setupActivity(BarActivity.class);
assertThat(dispatchingAndroidInjector.maybeInject(activity)).isFalse();
}
@Test
public void throwsIfFactoryCreateReturnsNull() {
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector =
newDispatchingAndroidInjector(
ImmutableMap.of(FooActivity.class, () -> null), ImmutableMap.of());
FooActivity activity = Robolectric.setupActivity(FooActivity.class);
try {
dispatchingAndroidInjector.maybeInject(activity);
fail("Expected NullPointerException");
} catch (NullPointerException expected) {
}
}
@Test
public void throwsIfClassMismatched() {
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector =
newDispatchingAndroidInjector(
ImmutableMap.of(FooActivity.class, BarInjector.Factory::new), ImmutableMap.of());
FooActivity activity = Robolectric.setupActivity(FooActivity.class);
try {
dispatchingAndroidInjector.maybeInject(activity);
fail("Expected InvalidInjectorBindingException");
} catch (InvalidInjectorBindingException expected) {
}
}
private static <T> DispatchingAndroidInjector<T> newDispatchingAndroidInjector(
Map<Class<?>, Provider<Factory<?>>> injectorFactoriesWithClassKeys,
Map<String, Provider<AndroidInjector.Factory<?>>>
injectorFactoriesWithStringKeys) {
return new DispatchingAndroidInjector<>(
injectorFactoriesWithClassKeys,
injectorFactoriesWithStringKeys ,
ImmutableMap.of(),
ImmutableMap.of());
}
static class FooActivity extends Activity {}
static class BarActivity extends Activity {}
static class FooInjector implements AndroidInjector<FooActivity> {
@Override
public void inject(FooActivity instance) {}
static class Factory implements AndroidInjector.Factory<FooActivity> {
@Override
public AndroidInjector<FooActivity> create(FooActivity activity) {
return new FooInjector();
}
}
}
static class BarInjector implements AndroidInjector<BarActivity> {
@Override
public void inject(BarActivity instance) {}
static class Factory implements AndroidInjector.Factory<BarActivity> {
@Override
public AndroidInjector<BarActivity> create(BarActivity activity) {
return new BarInjector();
}
}
}
}