package org.jooby.json;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.isA;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import org.jooby.Env;
import org.jooby.test.MockUnit;
import org.jooby.test.MockUnit.Block;
import org.jooby.Parser;
import org.jooby.Renderer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.inject.Binder;
import com.google.inject.binder.AnnotatedBindingBuilder;
import com.google.inject.binder.LinkedBindingBuilder;
import com.google.inject.multibindings.Multibinder;
import com.typesafe.config.Config;
@RunWith(PowerMockRunner.class)
@PrepareForTest({Gzon.class, Gson.class, GsonBuilder.class, Multibinder.class })
public class GzonTest {
@SuppressWarnings("unchecked")
private Block body = unit -> {
GsonBuilder gsonb = unit.mockConstructor(GsonBuilder.class);
unit.registerMock(GsonBuilder.class, gsonb);
Gson gson = unit.get(Gson.class);
AnnotatedBindingBuilder<Gson> abbGson = unit.mock(AnnotatedBindingBuilder.class);
abbGson.toInstance(gson);
Binder binder = unit.get(Binder.class);
expect(binder.bind(Gson.class)).andReturn(abbGson);
expect(gsonb.create()).andReturn(gson);
LinkedBindingBuilder<Parser> lbbparser = unit.mock(LinkedBindingBuilder.class);
lbbparser.toInstance(isA(GsonParser.class));
Multibinder<Parser> mbparser = unit.mock(Multibinder.class);
expect(mbparser.addBinding()).andReturn(lbbparser);
LinkedBindingBuilder<Renderer> lbbrenderer = unit.mock(LinkedBindingBuilder.class);
lbbrenderer.toInstance(isA(GsonRenderer.class));
Multibinder<Renderer> mbrenderer = unit.mock(Multibinder.class);
expect(mbrenderer.addBinding()).andReturn(lbbrenderer);
unit.mockStatic(Multibinder.class);
expect(Multibinder.newSetBinder(binder, Parser.class)).andReturn(mbparser);
expect(Multibinder.newSetBinder(binder, Renderer.class)).andReturn(mbrenderer);
};
@Test
public void defaults() throws Exception {
new MockUnit(Env.class, Config.class, Binder.class, Gson.class)
.expect(body)
.run(unit -> {
new Gzon()
.configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class));
});
}
@SuppressWarnings("unchecked")
@Test
public void withCallback() throws Exception {
new MockUnit(Env.class, Config.class, Binder.class, Gson.class, Consumer.class)
.expect(body)
.expect(unit -> {
unit.get(Consumer.class).accept(unit.get(GsonBuilder.class));
})
.run(unit -> {
new Gzon()
.doWith(unit.get(Consumer.class))
.configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class));
});
}
@SuppressWarnings("unchecked")
@Test
public void with2ArgsCallback() throws Exception {
new MockUnit(Env.class, Config.class, Binder.class, Gson.class, BiConsumer.class)
.expect(body)
.expect(unit -> {
unit.get(BiConsumer.class).accept(unit.get(GsonBuilder.class), unit.get(Config.class));
})
.run(unit -> {
new Gzon()
.doWith(unit.get(BiConsumer.class))
.configure(unit.get(Env.class), unit.get(Config.class), unit.get(Binder.class));
});
}
}