001    // Copyright May 21, 2006 The Apache Software Foundation
002    //
003    // Licensed under the Apache License, Version 2.0 (the "License");
004    // you may not use this file except in compliance with the License.
005    // You may obtain a copy of the License at
006    //
007    //     http://www.apache.org/licenses/LICENSE-2.0
008    //
009    // Unless required by applicable law or agreed to in writing, software
010    // distributed under the License is distributed on an "AS IS" BASIS,
011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012    // See the License for the specific language governing permissions and
013    // limitations under the License.
014    package org.apache.tapestry.internal.event.impl;
015    
016    import org.apache.tapestry.*;
017    import org.apache.tapestry.event.BrowserEvent;
018    import org.apache.tapestry.event.EventTarget;
019    import org.apache.tapestry.form.FormSupport;
020    import org.apache.tapestry.internal.event.ComponentEventProperty;
021    import org.apache.tapestry.listener.ListenerInvoker;
022    import org.apache.tapestry.listener.ListenerMap;
023    import org.apache.tapestry.spec.ComponentSpecification;
024    import org.apache.tapestry.spec.IComponentSpecification;
025    import org.apache.tapestry.valid.IValidationDelegate;
026    import static org.easymock.EasyMock.*;
027    import org.testng.annotations.Test;
028    
029    import java.util.HashMap;
030    import java.util.Map;
031    
032    
033    /**
034     * Tests functionality of {@link ComponentEventInvoker}.
035     *
036     * @author jkuhnert
037     */
038    @Test
039    public class ComponentEventInvokerTest extends BaseComponentTestCase
040    {
041    
042        public void test_Event_Properties()
043        {
044            IComponentSpecification spec = new ComponentSpecification();
045            spec.addEventListener("comp1", new String[] {"onClick"}, "testFoo", null, false, false, false, false);
046    
047            assert spec.getComponentEvents("comp1") != null;
048            assert spec.getComponentEvents("comp1").getEvents().size() == 1;
049    
050            ComponentEventProperty prop = spec.getComponentEvents("comp1");
051            assertNotNull(prop);
052            assertEquals(prop.getEventListeners("onClick").size(), 1);
053    
054            prop = spec.getComponentEvents("comp2");
055            assert prop == null;
056        }
057    
058        public void test_Form_Event_Properties()
059        {
060            IComponentSpecification spec = new ComponentSpecification();
061            spec.addEventListener("comp1", new String[] {"onClick"}, "testFoo", "form", false, true, false, false);
062            spec.addEventListener("comp1", new String[] {"onClick"}, "testBar", "form", false, true, false, false);
063    
064            assert spec.getComponentEvents("comp1") != null;
065    
066            ComponentEventProperty p = spec.getComponentEvents("comp1");
067    
068            // should be only form events bound
069            assertEquals(p.getEvents().size(), 0);
070            assertEquals(p.getEventListeners("onClick").size(), 0);
071    
072            assertEquals(p.getComponentId(), "comp1");
073            assertEquals(p.getFormEventListeners("onClick").size(), 2);
074            assertEquals(p.getFormEvents().size(), 1);
075        }
076    
077        public void test_Get_Event_Property_Listeners()
078        {
079            IComponentSpecification spec = new ComponentSpecification();
080            spec.setComponentClassName("first.test");
081            spec.addEventListener("comp1", new String[] {"onClick"}, "testFoo", null, false, true, false, false);
082            spec.addEventListener("comp1", new String[] {"onClick"}, "testBar", null, false, true, false, false);
083    
084            IComponentSpecification spec2 = new ComponentSpecification();
085            spec.setComponentClassName("second.test"); // to make .equals unique
086            spec2.addEventListener("comp1", new String[] {"onClick"}, "testFoo", null, false, true, false, false);
087            spec2.addEventListener("comp1", new String[] {"onClick"}, "testBar", null, false, true, false, false);
088    
089            ComponentEventInvoker invoker = new ComponentEventInvoker();
090            invoker.addEventListener("comp1", spec);
091            invoker.addEventListener("comp1", spec2);
092    
093            ComponentEventProperty[] empty = invoker.getEventPropertyListeners("bogus");
094            assert empty != null;
095            assertEquals(empty.length, 0);
096    
097            ComponentEventProperty[] props = invoker.getEventPropertyListeners("comp1");
098            assertEquals(props.length, 2);
099    
100            assert invoker.getEventPropertyListeners("comp1") == props;
101        }
102    
103        public void test_Invoke_Component_Listener()
104        {
105            IRequestCycle cycle = newCycle();
106            IComponent comp = newComponent();
107            checkOrder(comp, false);
108    
109            IPage page = newMock(IPage.class);
110            ListenerInvoker listenerInvoker = newMock(ListenerInvoker.class);
111            ListenerMap listenerMap = newMock(ListenerMap.class);
112            IActionListener listener1 = newMock(IActionListener.class);
113    
114            IComponentSpecification spec = new ComponentSpecification();
115    
116            Map tprops = new HashMap();
117            tprops.put("id", "testId");
118            BrowserEvent event = new BrowserEvent("onSelect", new EventTarget(tprops));
119    
120            ComponentEventInvoker invoker = new ComponentEventInvoker();
121            invoker.setInvoker(listenerInvoker);
122    
123            spec.addEventListener("testId", new String[] { "onSelect" },
124                                  "fooListener", null, false, false, false, false);
125            invoker.addEventListener("testId", spec);
126    
127            expect(comp.getExtendedId()).andReturn("testId").anyTimes();
128            expect(comp.getSpecification()).andReturn(spec).anyTimes();
129            expect(comp.getPage()).andReturn(page);
130    
131            expect(page.getNestedComponent(null)).andReturn(comp);
132            expect(comp.getListeners()).andReturn(listenerMap);
133    
134            expect(listenerMap.getListener("fooListener")).andReturn(listener1);
135    
136            listenerInvoker.invokeListener(listener1, comp, cycle);
137    
138            replay();
139    
140            invoker.invokeListeners(comp, cycle, event);
141    
142            verify();
143        }
144    
145        public void test_Invoke_Element_Listener()
146        {
147            IRequestCycle cycle = newCycle();
148            IComponent comp = newComponent();
149            checkOrder(comp, false);
150    
151            IPage page = newMock(IPage.class);
152            IComponentSpecification spec = new ComponentSpecification();
153    
154            ListenerInvoker listenerInvoker = newMock(ListenerInvoker.class);
155            ListenerMap listenerMap = newMock(ListenerMap.class);
156            IActionListener listener = newMock(IActionListener.class);
157    
158            Map tprops = new HashMap();
159            tprops.put("id", "testId");
160            BrowserEvent event = new BrowserEvent("onSelect", new EventTarget(tprops));
161    
162            ComponentEventInvoker invoker = new ComponentEventInvoker();
163            invoker.setInvoker(listenerInvoker);
164    
165            spec.addElementEventListener("testId", new String[] { "onSelect" },
166                                         "fooListener", null, false, true, true);
167            invoker.addEventListener("testId", spec);
168    
169            expect(comp.getExtendedId()).andReturn("testId").anyTimes();
170            expect(comp.getSpecification()).andReturn(spec).anyTimes();
171            expect(comp.getPage()).andReturn(page);
172    
173            expect(comp.getListeners()).andReturn(listenerMap);
174    
175            expect(listenerMap.getListener("fooListener")).andReturn(listener);
176    
177            listenerInvoker.invokeListener(listener, comp, cycle);
178    
179            replay();
180    
181            invoker.invokeListeners(comp, cycle, event);
182    
183            verify();
184        }
185    
186        public void test_Invoke_Form_Listener()
187        {
188            IRequestCycle cycle = newCycle();
189            IForm form = newForm();
190            checkOrder(form, false);
191            FormSupport formSupport = newMock(FormSupport.class);
192            IComponentSpecification spec = new ComponentSpecification();
193            IValidationDelegate delegate = newMock(IValidationDelegate.class);
194            ListenerInvoker listenerInvoker = newMock(ListenerInvoker.class);
195            ListenerMap listenerMap = newMock(ListenerMap.class);
196            IActionListener listener = newMock(IActionListener.class);
197            IPage page = newMock(IPage.class);
198            checkOrder(page, false);
199    
200            Map tprops = new HashMap();
201            tprops.put("id", "form1");
202            BrowserEvent event = new BrowserEvent("onSelect", "form1", "form1", new EventTarget(tprops));
203    
204            ComponentEventInvoker invoker = new ComponentEventInvoker();
205            invoker.setInvoker(listenerInvoker);
206    
207            spec.addEventListener("form1", new String[] { "onSelect" }, "fooListener",
208                                  "form1", false, false, false, false);
209            invoker.addFormEventListener("form1", spec);
210    
211            expect(formSupport.getForm()).andReturn(form);
212            expect(form.getExtendedId()).andReturn("form1").anyTimes();
213    
214            expect(form.getPage()).andReturn(page);
215            expect(page.getNestedComponent(null)).andReturn(form);        
216            expect(form.getDelegate()).andReturn(delegate).anyTimes();
217    
218            delegate.clearErrors();
219            expectLastCall().anyTimes();
220    
221            expect(form.getListeners()).andReturn(listenerMap);
222            expect(listenerMap.getListener("fooListener")).andReturn(listener);
223    
224            form.addDeferredRunnable(isA(Runnable.class));
225    
226            cycle.disableFocus();
227    
228            replay();
229    
230            invoker.invokeFormListeners(formSupport, cycle, event);
231    
232            verify();
233        }
234    
235        public void test_Invoke_Form_Listener_Enabled_Focus()
236        {
237            IRequestCycle cycle = newCycle();
238            IForm form = newForm();
239            checkOrder(form, false);
240            FormSupport formSupport = newMock(FormSupport.class);
241            IComponentSpecification spec = new ComponentSpecification();
242            IValidationDelegate delegate = newMock(IValidationDelegate.class);
243    
244            ListenerInvoker listenerInvoker = newMock(ListenerInvoker.class);
245            ListenerMap listenerMap = newMock(ListenerMap.class);
246            IActionListener listener = newMock(IActionListener.class);
247            IPage page = newMock(IPage.class);
248            checkOrder(page, false);
249    
250            Map comps = new HashMap();
251            comps.put("form1", form);
252    
253            Map tprops = new HashMap();
254            tprops.put("id", "form1");
255            BrowserEvent event = new BrowserEvent("onSelect", "form1", "form1", new EventTarget(tprops));
256    
257            ComponentEventInvoker invoker = new ComponentEventInvoker();
258            invoker.setInvoker(listenerInvoker);
259    
260            spec.addEventListener("form1", new String[] { "onSelect" }, "fooListener",
261                                  "form1", false, false, true, false);
262            invoker.addFormEventListener("form1", spec);
263    
264            expect(formSupport.getForm()).andReturn(form);
265            expect(form.getExtendedId()).andReturn("form1").anyTimes();
266    
267            expect(form.getPage()).andReturn(page);
268            expect(page.getNestedComponent(null)).andReturn(form);
269            
270            expect(form.getDelegate()).andReturn(delegate).anyTimes();
271    
272            delegate.clearErrors();
273            expectLastCall().anyTimes();
274    
275            expect(form.getListeners()).andReturn(listenerMap);
276    
277            expect(listenerMap.getListener("fooListener")).andReturn(listener);
278    
279            form.addDeferredRunnable(isA(Runnable.class));
280    
281            replay();
282    
283            invoker.invokeFormListeners(formSupport, cycle, event);
284    
285            verify();
286        }
287    }