package org.richfaces.component.behavior; import static org.easymock.EasyMock.capture; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.same; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import java.util.Collections; import javax.faces.convert.Converter; import javax.faces.convert.NumberConverter; import org.easymock.Capture; import org.easymock.EasyMock; import org.jboss.test.faces.mock.Mock; import org.jboss.test.faces.mock.MockTestRunner; import org.jboss.test.faces.mock.Stub; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.richfaces.application.ServiceTracker; import org.richfaces.validator.ConverterDescriptor; import org.richfaces.validator.FacesConverterService; /** * <p class="changed_added_4_0"> * This class tests client validator behavior. as it described at https://community.jboss.org/wiki/ClientSideValidation # * Server-side rendering algorithm * </p> * * @author asmirnov@exadel.com * */ @RunWith(MockTestRunner.class) public class BehaviorGetConverterTest extends BehaviorTestBase { @Mock private Converter converter; @Mock private FacesConverterService converterService; @Stub private ConverterDescriptor descriptor; private Capture<Converter> converterCapture; @Before public void setupService() { expect(factory.getInstance(FacesConverterService.class)).andStubReturn(converterService); converterCapture = new Capture<Converter>(); expect( converterService.getConverterDescription(same(environment.getFacesContext()), same(input), capture(converterCapture), EasyMock.<String>isNull())).andStubReturn(descriptor); ServiceTracker.setFactory(factory); } @After public void releaseService() { ServiceTracker.release(); } /** * <p class="changed_added_4_0"> * Server-side rendering algorithm .3 - determine client-side converter * </p> * * @throws Exception */ @Test public void testGetClientConverterFromComponent() throws Exception { NumberConverter converter = new NumberConverter(); expect(input.getConverter()).andReturn(converter); expect(input.getAttributes()).andStubReturn(Collections.<String, Object>emptyMap()); checkConverter(converter); } /** * <p class="changed_added_4_0"> * Server-side rendering algorithm .3 - determine client-side converter * </p> * * @throws Exception */ @Test public void testGetClientConverterByType() throws Exception { setupConverterFromApplication(converter); expect(input.getAttributes()).andStubReturn(Collections.<String, Object>emptyMap()); checkConverter(converter); } private void setupConverterFromApplication(Converter converter) { expect(input.getConverter()).andReturn(null); expect(input.getValueExpression("value")).andReturn(expression); expect((Class) (expression.getType(environment.getElContext()))).andReturn(Number.class); expect(environment.getApplication().createConverter(Number.class)).andReturn(converter); } @Test(expected = ConverterNotFoundException.class) public void testGetConverterNotExists() throws Exception { setupConverterFromApplication(null); checkConverter(null); } @Test public void testSetConverterForString() throws Exception { expect(input.getConverter()).andReturn(null); expect(input.getValueExpression("value")).andReturn(expression); expect((Class) (expression.getType(environment.getElContext()))).andReturn(String.class); expect(environment.getApplication().createConverter(String.class)).andReturn(null); checkConverter(null); } private void checkConverter(Converter converter) throws ConverterNotFoundException { setupBehaviorContext(input); controller.replay(); ConverterDescriptor converter2 = behavior.getConverter(behaviorContext); controller.verify(); if (null == converter) { assertNull(converter2); } else { assertNotNull(converter2); assertSame(converter, converterCapture.getValue()); } } }