package org.jooby.internal;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;
import org.jooby.internal.parser.LocaleParser;
import org.jooby.internal.parser.StaticMethodParser;
import org.jooby.test.MockUnit;
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.inject.TypeLiteral;
@RunWith(PowerMockRunner.class)
@PrepareForTest({StaticMethodTypeConverter.class, LocaleParser.class,
StaticMethodParser.class })
public class StaticMethodTypeConverterTest {
@Test
public void toAnythingElse() throws Exception {
TypeLiteral<Object> type = TypeLiteral.get(Object.class);
new MockUnit()
.expect(unit -> {
StaticMethodParser converter = unit
.mockConstructor(StaticMethodParser.class, new Class[]{String.class },
"valueOf");
expect(converter.parse(eq(type), eq("y"))).andReturn("x");
})
.run(unit -> {
assertEquals("x", new StaticMethodTypeConverter<Object>("valueOf").convert("y", type));
});
}
@Test(expected = IllegalStateException.class)
public void runtimeError() throws Exception {
TypeLiteral<Object> type = TypeLiteral.get(Object.class);
new MockUnit()
.expect(unit -> {
StaticMethodParser converter = unit
.mockConstructor(StaticMethodParser.class, new Class[]{String.class },
"valueOf");
expect(converter.parse(eq(type), eq("y")))
.andThrow(new IllegalArgumentException("intentional err"));
})
.run(unit -> {
new StaticMethodTypeConverter<Object>("valueOf").convert("y", type);
});
}
@Test
@SuppressWarnings({"rawtypes", "unchecked" })
public void shouldNotMatchEnums() throws Exception {
TypeLiteral type = TypeLiteral.get(Enum.class);
new MockUnit()
.run(unit -> {
assertEquals(false, new StaticMethodTypeConverter<Object>("valueOf").matches(type));
});
}
@Test
public void shouldStaticMethod() throws Exception {
TypeLiteral<Package> type = TypeLiteral.get(Package.class);
assertEquals(true, new StaticMethodTypeConverter<Package>("getPackage").matches(type));
}
@Test
public void describe() throws Exception {
assertEquals("forName(String)", new StaticMethodTypeConverter<Package>("forName").toString());
}
}