001    package org.apache.tapestry.binding;
002    
003    import org.apache.hivemind.ApplicationRuntimeException;
004    import org.apache.hivemind.Location;
005    import org.apache.tapestry.IComponent;
006    import org.apache.tapestry.coerce.ValueConverter;
007    import static org.easymock.EasyMock.checkOrder;
008    import static org.easymock.EasyMock.expect;
009    import org.testng.annotations.Test;
010    
011    import java.util.Arrays;
012    import java.util.HashMap;
013    import java.util.List;
014    import java.util.Map;
015    
016    /**
017     * Tests functionality of {@link ClientIdListBinding}. 
018     */
019    @Test
020    public class TestClientIdListBinding extends BindingTestCase {
021    
022        public void test_Single_Component()
023        {
024            IComponent nested = newComponent();
025            IComponent component = newMock(IComponent.class);
026            ValueConverter vc = newValueConverter();
027    
028            Map comps = new HashMap();
029            comps.put("foo", nested);
030            
031            expect(component.getComponents()).andReturn(comps);
032            expect(component.getComponent("foo")).andReturn(nested);
033            expect(nested.getClientId()).andReturn("fooClientId");
034    
035            List clientIds = Arrays.asList("fooClientId");
036            
037            expect(vc.coerceValue(clientIds, List.class)).andReturn(clientIds);
038    
039            Location l = newLocation();
040    
041            replay();
042    
043            ClientIdListBinding b = new ClientIdListBinding("param", vc, l, component, new String[]{"foo"});
044    
045            assert component == b.getComponent();
046            assertEquals(b.getObject(List.class), Arrays.asList("fooClientId"));
047            
048            verify();
049        }
050    
051        public void test_Multiple_Components()
052        {
053            IComponent compA = newComponent();
054            IComponent compB = newComponent();
055            ValueConverter vc = newValueConverter();
056            
057            IComponent component = newMock(IComponent.class);
058            checkOrder(component, false);
059            
060            Map comps = new HashMap();
061            comps.put("fred", compA);
062            comps.put("barney", compB);
063    
064            expect(component.getComponents()).andReturn(comps).anyTimes();
065            expect(component.getComponent("fred")).andReturn(compA);
066            expect(compA.getClientId()).andReturn("comp_1");
067    
068            expect(component.getComponent("barney")).andReturn(compB);
069            expect(compB.getClientId()).andReturn("comp_0");
070    
071            List clientIds = Arrays.asList("comp_1", "comp_0");
072    
073            expect(vc.coerceValue(clientIds, List.class)).andReturn(clientIds);
074    
075            Location l = newLocation();
076    
077            replay();
078    
079            ClientIdListBinding b = new ClientIdListBinding("param", vc, l, component, new String[]{"fred", "barney"});
080    
081            assert component == b.getComponent();
082            assertEquals(b.getObject(List.class), Arrays.asList("comp_1", "comp_0"));
083    
084            verify();
085        }
086    
087        public void test_Get_Object_Failure()
088        {
089            IComponent component = newMock(IComponent.class);
090            Map comps = new HashMap();
091            
092            expect(component.getComponents()).andReturn(comps);
093            expect(component.getPage()).andReturn(null);
094    
095            ValueConverter vc = newValueConverter();
096    
097            Location l = newLocation();
098    
099            replay();
100    
101            ClientIdListBinding b = new ClientIdListBinding("param", vc, l, component, new String[]{"foo"});
102    
103            try
104            {
105                b.getObject();
106                unreachable();
107            }
108            catch (ApplicationRuntimeException ex)
109            {
110                assert ex.getMessage().indexOf("id foo not found in container") > -1;
111                assertSame(l, ex.getLocation());
112            }
113    
114            verify();
115        }
116    }