Skip to content

Commit

Permalink
Overriding multiple modules causes the submodule to be configured twice
Browse files Browse the repository at this point in the history
#258

* refactoring tests
* more tests
  • Loading branch information
andrus committed Mar 14, 2019
1 parent 1702ca4 commit 805edd1
Show file tree
Hide file tree
Showing 2 changed files with 401 additions and 232 deletions.
232 changes: 0 additions & 232 deletions bootique/src/test/java/io/bootique/BootiqueIT.java
Expand Up @@ -19,13 +19,8 @@


package io.bootique; package io.bootique;


import com.google.inject.Binder;
import com.google.inject.BindingAnnotation;
import com.google.inject.Injector; import com.google.inject.Injector;
import com.google.inject.Key; import com.google.inject.Key;
import com.google.inject.Module;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import io.bootique.annotation.Args; import io.bootique.annotation.Args;
import io.bootique.cli.Cli; import io.bootique.cli.Cli;
import io.bootique.command.Command; import io.bootique.command.Command;
Expand All @@ -34,12 +29,7 @@
import io.bootique.meta.application.CommandMetadata; import io.bootique.meta.application.CommandMetadata;
import org.junit.Test; import org.junit.Test;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;


import static java.util.Arrays.asList; import static java.util.Arrays.asList;
import static org.junit.Assert.*; import static org.junit.Assert.*;
Expand Down Expand Up @@ -120,226 +110,4 @@ public void testApp_Collection() {
String[] args = i.getInstance(Key.get(String[].class, Args.class)); String[] args = i.getInstance(Key.get(String[].class, Args.class));
assertArrayEquals(this.args, args); assertArrayEquals(this.args, args);
} }

@Test
public void testCreateInjector_Overrides() {
Injector i = Bootique.app(args).override(BQCoreModule.class).with(M0.class).createInjector();

String[] args = i.getInstance(Key.get(String[].class, Args.class));
assertSame(M0.ARGS, args);
}

@Test
public void testCreateInjector_Override_Two_With_One() {

Sub_M34.configCalls = 0;
M3.configCalls = 0;
M4.configCalls = 0;

Injector i = Bootique.app(args)
.module(M3.class)
.module(M4.class)
.override(M3.class, M4.class).with(Sub_M34.class)
.createInjector();

assertEquals("Overriding module is expected to be called once and only once", 1, Sub_M34.configCalls);
assertEquals("Overridden module is expected to be called once and only once", 1, M3.configCalls);
assertEquals("Overridden module is expected to be called once and only once", 1, M4.configCalls);

String s1 = i.getInstance(Key.get(String.class, S1.class));
assertEquals("m34_s1", s1);

String s2 = i.getInstance(Key.get(String.class, S2.class));
assertEquals("m34_s2", s2);
}

@Test
public void testCreateInjector_Overrides_Multi_Level() {
Injector i = Bootique.app(args)
.override(BQCoreModule.class).with(M0.class)
.override(M0.class).with(M1.class)
.createInjector();

String[] args = i.getInstance(Key.get(String[].class, Args.class));
assertSame(M1.ARGS, args);
}

@Test
public void testCreateInjector_Overrides_OriginalModuleServices() {
Injector i = Bootique.app(args)
.module(M2.class)
.override(M2.class).with(SubM2.class)
.createInjector();

String s2 = i.getInstance(Key.get(String.class, S2.class));
assertEquals("sub_m2_s2_m2_s1", s2);
}

@Test
public void testCreateInjector_Overrides_Multi_Level_OriginalModuleServices() {
Injector i = Bootique.app(args)
.module(M2.class)
.override(M2.class).with(SubM2.class)
.override(SubM2.class).with(SubSubM2.class)
.createInjector();

String s2 = i.getInstance(Key.get(String.class, S2.class));
assertEquals("sub_sub_m2_s2_m2_s1", s2);
}

@Test
public void testCreateInjector_OverridesWithProvider() {
BQModuleProvider provider = new BQModuleProvider() {

@Override
public Module module() {
return new M0();
}

@Override
public Collection<Class<? extends Module>> overrides() {
return Collections.singleton(BQCoreModule.class);
}
};

Injector i = Bootique.app(args).module(provider).createInjector();

String[] args = i.getInstance(Key.get(String[].class, Args.class));
assertSame(M0.ARGS, args);
}

@Target({ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@BindingAnnotation
@interface S1 {

}

@Target({ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@BindingAnnotation
@interface S2 {

}

static class M0 implements Module {

static String[] ARGS = {"1", "2", "3"};

@Override
public void configure(Binder binder) {
binder.bind(String[].class).annotatedWith(Args.class).toInstance(ARGS);
}
}

static class M1 implements Module {

static String[] ARGS = {"x", "y", "z"};

@Override
public void configure(Binder binder) {
binder.bind(String[].class).annotatedWith(Args.class).toInstance(ARGS);
}
}

static class M2 implements Module {

@Override
public void configure(Binder binder) {
}

@S1
@Provides
@Singleton
String getS1() {
return "m2_s1";
}
}

static class SubM2 implements Module {

@Override
public void configure(Binder binder) {
}

@S2
@Provides
@Singleton
String getS2(@S1 String s1) {
return "sub_m2_s2_" + s1;
}
}

static class SubSubM2 implements Module {

@Override
public void configure(Binder binder) {
}

@S2
@Provides
@Singleton
String getS2(@S1 String s1) {
return "sub_sub_m2_s2_" + s1;
}
}

static class M3 implements Module {

static int configCalls;

@Override
public void configure(Binder binder) {
configCalls++;
}

@S1
@Provides
@Singleton
String getS1() {
return "m3_s1";
}
}

static class M4 implements Module {

static int configCalls;

@Override
public void configure(Binder binder) {
configCalls++;
}

@S2
@Provides
@Singleton
String getS2() {
return "m4_s2";
}
}

static class Sub_M34 implements Module {

static int configCalls;

@Override
public void configure(Binder binder) {
configCalls++;
}

@S1
@Provides
@Singleton
String getS1() {
return "m34_s1";
}

@S2
@Provides
@Singleton
String getS2() {
return "m34_s2";
}
}

} }

0 comments on commit 805edd1

Please sign in to comment.