package br.com.caelum.iogi.conversion; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.jmock.Expectations; import org.jmock.Mockery; import org.jmock.lib.legacy.ClassImposteriser; import org.junit.After; import org.junit.Before; import org.junit.Test; import br.com.caelum.iogi.Instantiator; import br.com.caelum.iogi.parameters.Parameter; import br.com.caelum.iogi.parameters.Parameters; import br.com.caelum.iogi.reflection.Target; public class FalllbackConverterTests { private Mockery context; private TypeConverter<Object> delegateConverter; private final Object anything = new Object(); @SuppressWarnings("unchecked") @Before public void setUp() { context = new Mockery(); context.setImposteriser(ClassImposteriser.INSTANCE); delegateConverter = context.mock(TypeConverter.class); } @After public void tearDown() { context.assertIsSatisfied(); } @Test public void fallbackInstantiatorIsAbleToInstantiateATargetIfTheDelegateInstantiatorIsAbleToDoIt() throws Exception { final Target<Object> target = Target.create(Object.class, "foo"); context.checking(new Expectations() {{ allowing(delegateConverter).isAbleToInstantiate(target); will(returnValue(true)); }}); final Instantiator<Object> fallbackInstantiator = new FallbackConverter<Object>(delegateConverter, anything); assertTrue(fallbackInstantiator.isAbleToInstantiate(target)); } @Test public void fallbackInstantiatorIsNotAbleToInstantiateATargetIfTheDelegateInstantiatorIsntAbleToDoIt() throws Exception { final Target<Object> target = Target.create(Object.class, "foo"); context.checking(new Expectations() {{ allowing(delegateConverter).isAbleToInstantiate(target); will(returnValue(false)); }}); final Instantiator<Object> fallbackInstantiator = new FallbackConverter<Object>(delegateConverter, anything); assertFalse(fallbackInstantiator.isAbleToInstantiate(target)); } @Test public void fallbackInstantiatorWillCallDelegateConverterIfParameterValueIsNotEmpty() throws Exception { final Target<Object> target = Target.create(Object.class, "foo"); final Parameters parameters = new Parameters(new Parameter("foo", "bar")); context.checking(new Expectations() {{ one(delegateConverter).convert("bar", target); }}); final Instantiator<Object> fallbackInstantiator = new FallbackConverter<Object>(delegateConverter, anything); fallbackInstantiator.instantiate(target, parameters); } @Test public void fallbackInstantiatorWillReturnTheFallbackValueIfParameterValueIsEmpty() throws Exception { final Target<Object> target = Target.create(Object.class, "foo"); final Parameters parameters = new Parameters(new Parameter("foo", "")); final Object fallbackValue = new Object(); final Instantiator<Object> fallbackInstantiator = new FallbackConverter<Object>(delegateConverter, fallbackValue); assertEquals(fallbackValue, fallbackInstantiator.instantiate(target, parameters)); } }