001    // Copyright Jun 3, 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;
015    
016    import org.apache.tapestry.TestBase;
017    import org.apache.tapestry.event.BrowserEvent;
018    import org.testng.annotations.Test;
019    
020    import java.util.Iterator;
021    import java.util.List;
022    import java.util.Set;
023    
024    
025    /**
026     * Tests for {@link ComponentEventProperty} and {@link EventBoundListener}.
027     * 
028     * @author jkuhnert
029     */
030    @Test
031    public class ComponentEventPropertyTest extends TestBase {
032    
033        public void test_Add_Event_Listener()
034        {
035            String[] events = {"onClick", "onFoo"};
036            ComponentEventProperty prop = new ComponentEventProperty("compid");
037            
038            prop.addListener(events, "doFoo", null, false, false, false);
039            
040            assertEquals("compid", prop.getComponentId());
041            assertEquals(2, prop.getEvents().size());
042            assertEquals(0, prop.getFormEvents().size());
043            
044            assertNotNull(prop.getEventListeners("onClick"));
045            
046            List listeners = prop.getEventListeners("onClick");
047            assertEquals(1, listeners.size());
048            
049            EventBoundListener listener = (EventBoundListener)listeners.get(0);
050            assertEquals("compid", listener.getComponentId());
051            assertNull(listener.getFormId());
052            assertEquals("doFoo", listener.getMethodName());
053            assert listener.isAutoSubmit();
054        }
055    
056        public void test_Disabled_Async_Property()
057        {
058            String[] events = { "onchange" };
059            ComponentEventProperty p = new ComponentEventProperty("compid");
060    
061            p.addListener(events, "submitForm", null, false, false, false, true);
062    
063            List listeners = p.getEventListeners("onchange");
064            assertEquals(1, listeners.size());
065    
066            EventBoundListener l = (EventBoundListener) listeners.get(0);
067            assert !l.isAsync();
068        }
069    
070        public void test_Add_Form_Event_Listener()
071        {
072            String[] events = {"onFoo"};
073            ComponentEventProperty prop = new ComponentEventProperty("compid");
074            
075            prop.addListener(events, "doFoo", "formid", false, true, false);
076            
077            assertEquals("compid", prop.getComponentId());
078            assertEquals(0, prop.getEvents().size());
079            assertEquals(1, prop.getFormEvents().size());
080            
081            assertNotNull(prop.getFormEventListeners("onFoo"));
082            
083            List listeners = prop.getFormEventListeners("onFoo");
084            assertEquals(1, listeners.size());
085            
086            EventBoundListener listener = (EventBoundListener)listeners.get(0);
087            assertEquals("compid", listener.getComponentId());
088            assertEquals("formid", listener.getFormId());
089            assertFalse(listener.isValidateForm());
090            assertTrue(listener.isAsync());
091            
092            assertEquals(1, prop.getFormEvents().size());
093            
094            assertEquals("doFoo", listener.getMethodName());
095            assert listener.isAutoSubmit();
096        }
097    
098        /**
099         * tests regression of TAPESTRY-2003
100         * */
101        public void test_Add_Form_Event_Listener_no_autoSubmit()
102        {
103            String[] events = {"onFoo"};
104            ComponentEventProperty prop = new ComponentEventProperty("compid");
105    
106            prop.addListener(events, "doFoo", "", false, true, false, false);
107            prop.connectAutoSubmitEvents("fooForm");
108    
109            assertEquals("compid", prop.getComponentId());
110            assertEquals(1, prop.getEvents().size());
111            assertEquals(0, prop.getFormEvents().size());
112    
113            List listeners = prop.getEventListeners("onFoo");
114            assertEquals(1, listeners.size());
115    
116            EventBoundListener listener = (EventBoundListener)listeners.get(0);
117            
118            assertEquals("doFoo", listener.getMethodName());
119            assert ! listener.isAutoSubmit();
120        }
121        
122        public void test_Add_Multiple_Event_Listener()
123        {
124            String[] events = {"onClick", "onFoo"};
125            ComponentEventProperty prop = new ComponentEventProperty("compid");
126            
127            prop.addListener(events, "doFoo", "form1", false, false, false);
128            prop.addListener(new String[]{"onchange"}, "doBar", "form2", false, false, false);
129            prop.addListener(new String[]{"onchange"}, "secondForm", "form1", false, false, false);
130            
131            assertEquals("compid", prop.getComponentId());
132            assertEquals(prop.getEvents().size(), 0);
133            assertEquals(prop.getFormEvents().size(), 3);
134            
135            Set s = prop.getFormEvents();
136            String[] fevents = (String[])s.toArray(new String[s.size()]);
137            
138            assertEquals(fevents.length, 3);
139            
140            List listeners = prop.getFormEventListeners("onchange");
141            assertEquals(listeners.size(), 2);
142            
143            listeners = prop.getFormEventListeners("onClick");
144            assertEquals(listeners.size(), 1);
145            
146            EventBoundListener listener = (EventBoundListener)listeners.get(0);
147            assertEquals("compid", listener.getComponentId());
148            assertEquals("form1", listener.getFormId());
149            assertEquals("doFoo", listener.getMethodName());
150            
151        }
152        
153        public void test_Get_Form_Events()
154        {
155            String[] events = {"onFoo"};
156            ComponentEventProperty prop = new ComponentEventProperty("compid");
157            BrowserEvent event = new BrowserEvent("onFoo", null);
158            
159            prop.addListener(events, "doFoo", "formid", false, false, true);
160            
161            List listeners = prop.getFormEventListeners("formid", event, null);
162            assertEquals(1, listeners.size());
163            
164            EventBoundListener listener = (EventBoundListener)listeners.get(0);
165            assertEquals("compid", listener.getComponentId());
166            assertEquals("formid", listener.getFormId());
167            assertFalse(listener.isValidateForm());
168            
169            assertEquals("doFoo", listener.getMethodName());
170            assertTrue(listener.shouldFocusForm());
171        }
172    
173        public void test_Connect_Auto_Submit_Events()
174        {
175            String[] events = {"onClick"};
176            ComponentEventProperty prop = new ComponentEventProperty("compid");
177            
178            prop.addListener(events, "doFoo", null, false, false, false, true);
179    
180            assertEquals("compid", prop.getComponentId());
181            assertEquals(prop.getEvents().size(), 1);
182            assertEquals(prop.getFormEvents().size(), 0);
183            
184            assertNotNull(prop.getEventListeners("onClick"));
185    
186            List listeners = prop.getEventListeners("onClick");
187            assertEquals(listeners.size(), 1);
188            
189            EventBoundListener listener = (EventBoundListener)listeners.get(0);
190            assertEquals(listener.getComponentId(), "compid");
191            assertNull(listener.getFormId());
192            assertEquals(listener.getMethodName(), "doFoo");
193            assert listener.isAutoSubmit();
194    
195            prop.connectAutoSubmitEvents("form");
196    
197            assertEquals(prop.getEvents().size(), 0);
198            assertEquals(prop.getFormEvents().size(), 1);
199    
200            listeners = prop.getFormEventListeners("onClick");
201            assertEquals(listeners.size(), 1);
202    
203            listener = (EventBoundListener)listeners.get(0);
204            assertEquals(listener.getComponentId(), "compid");
205            assertEquals(listener.getFormId(), "form");
206            assertEquals(listener.getMethodName(), "doFoo");
207        }
208    
209        public void test_ReWire_Component_Id()
210        {
211            String[] events = {"onClick", "onFoo"};
212            ComponentEventProperty prop = new ComponentEventProperty("compid");
213    
214            prop.addListener(events, "doFoo", null, false, false, false);
215            prop.addListener(new String[]{"onchange"}, "doBar", "form2", false, false, false);
216            prop.addListener(new String[]{"onchange"}, "secondForm", "form1", false, false, false);
217            
218            assertEquals("compid", prop.getComponentId());
219            assertEquals(prop.getEvents().size(), 2);
220            assertEquals(prop.getFormEvents().size(), 1);
221            
222            String path = "new/Path/Id";
223            String idPath = "Home/" + path;
224            prop.rewireComponentId(path, idPath);
225    
226            assertEquals(prop.getComponentId(), path);
227    
228    
229            Iterator it = prop.getEvents().iterator();
230            while (it.hasNext())
231            {
232                String key = (String) it.next();
233    
234                List listeners = prop.getEventListeners(key);
235                for (int i=0; i < listeners.size(); i++) {
236    
237                    EventBoundListener listener = (EventBoundListener) listeners.get(i);
238                    assertEquals(listener.getComponentId(), path);
239                    assertEquals(listener.getComponentIdPath(), idPath);
240                }
241            }
242    
243            it = prop.getFormEvents().iterator();
244            while (it.hasNext())
245            {
246                String key = (String) it.next();
247    
248                List listeners = prop.getFormEventListeners(key);
249                for (int i=0; i < listeners.size(); i++) {
250    
251                    EventBoundListener listener = (EventBoundListener) listeners.get(i);
252                    assertEquals(listener.getComponentId(), path);
253                    assertEquals(listener.getComponentIdPath(), idPath);
254                }
255            }
256        }
257    }