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        public void test_Add_Multiple_Event_Listener()
099        {
100            String[] events = {"onClick", "onFoo"};
101            ComponentEventProperty prop = new ComponentEventProperty("compid");
102            
103            prop.addListener(events, "doFoo", "form1", false, false, false);
104            prop.addListener(new String[]{"onchange"}, "doBar", "form2", false, false, false);
105            prop.addListener(new String[]{"onchange"}, "secondForm", "form1", false, false, false);
106            
107            assertEquals("compid", prop.getComponentId());
108            assertEquals(prop.getEvents().size(), 0);
109            assertEquals(prop.getFormEvents().size(), 3);
110            
111            Set s = prop.getFormEvents();
112            String[] fevents = (String[])s.toArray(new String[s.size()]);
113            
114            assertEquals(fevents.length, 3);
115            
116            List listeners = prop.getFormEventListeners("onchange");
117            assertEquals(listeners.size(), 2);
118            
119            listeners = prop.getFormEventListeners("onClick");
120            assertEquals(listeners.size(), 1);
121            
122            EventBoundListener listener = (EventBoundListener)listeners.get(0);
123            assertEquals("compid", listener.getComponentId());
124            assertEquals("form1", listener.getFormId());
125            assertEquals("doFoo", listener.getMethodName());
126            
127        }
128        
129        public void test_Get_Form_Events()
130        {
131            String[] events = {"onFoo"};
132            ComponentEventProperty prop = new ComponentEventProperty("compid");
133            BrowserEvent event = new BrowserEvent("onFoo", null);
134            
135            prop.addListener(events, "doFoo", "formid", false, false, true);
136            
137            List listeners = prop.getFormEventListeners("formid", event, null);
138            assertEquals(1, listeners.size());
139            
140            EventBoundListener listener = (EventBoundListener)listeners.get(0);
141            assertEquals("compid", listener.getComponentId());
142            assertEquals("formid", listener.getFormId());
143            assertFalse(listener.isValidateForm());
144            
145            assertEquals("doFoo", listener.getMethodName());
146            assertTrue(listener.shouldFocusForm());
147        }
148    
149        public void test_Connect_Auto_Submit_Events()
150        {
151            String[] events = {"onClick"};
152            ComponentEventProperty prop = new ComponentEventProperty("compid");
153            
154            prop.addListener(events, "doFoo", null, false, false, false, true);
155    
156            assertEquals("compid", prop.getComponentId());
157            assertEquals(prop.getEvents().size(), 1);
158            assertEquals(prop.getFormEvents().size(), 0);
159            
160            assertNotNull(prop.getEventListeners("onClick"));
161    
162            List listeners = prop.getEventListeners("onClick");
163            assertEquals(listeners.size(), 1);
164            
165            EventBoundListener listener = (EventBoundListener)listeners.get(0);
166            assertEquals(listener.getComponentId(), "compid");
167            assertNull(listener.getFormId());
168            assertEquals(listener.getMethodName(), "doFoo");
169            assert listener.isAutoSubmit();
170    
171            prop.connectAutoSubmitEvents("form");
172    
173            assertEquals(prop.getEvents().size(), 0);
174            assertEquals(prop.getFormEvents().size(), 1);
175    
176            listeners = prop.getFormEventListeners("onClick");
177            assertEquals(listeners.size(), 1);
178    
179            listener = (EventBoundListener)listeners.get(0);
180            assertEquals(listener.getComponentId(), "compid");
181            assertEquals(listener.getFormId(), "form");
182            assertEquals(listener.getMethodName(), "doFoo");
183        }
184    
185        public void test_ReWire_Component_Id()
186        {
187            String[] events = {"onClick", "onFoo"};
188            ComponentEventProperty prop = new ComponentEventProperty("compid");
189    
190            prop.addListener(events, "doFoo", null, false, false, false);
191            prop.addListener(new String[]{"onchange"}, "doBar", "form2", false, false, false);
192            prop.addListener(new String[]{"onchange"}, "secondForm", "form1", false, false, false);
193            
194            assertEquals("compid", prop.getComponentId());
195            assertEquals(prop.getEvents().size(), 2);
196            assertEquals(prop.getFormEvents().size(), 1);
197            
198            String path = "new/Path/Id";
199            String idPath = "Home/" + path;
200            prop.rewireComponentId(path, idPath);
201    
202            assertEquals(prop.getComponentId(), path);
203    
204    
205            Iterator it = prop.getEvents().iterator();
206            while (it.hasNext())
207            {
208                String key = (String) it.next();
209    
210                List listeners = prop.getEventListeners(key);
211                for (int i=0; i < listeners.size(); i++) {
212    
213                    EventBoundListener listener = (EventBoundListener) listeners.get(i);
214                    assertEquals(listener.getComponentId(), path);
215                    assertEquals(listener.getComponentIdPath(), idPath);
216                }
217            }
218    
219            it = prop.getFormEvents().iterator();
220            while (it.hasNext())
221            {
222                String key = (String) it.next();
223    
224                List listeners = prop.getFormEventListeners(key);
225                for (int i=0; i < listeners.size(); i++) {
226    
227                    EventBoundListener listener = (EventBoundListener) listeners.get(i);
228                    assertEquals(listener.getComponentId(), path);
229                    assertEquals(listener.getComponentIdPath(), idPath);
230                }
231            }
232        }
233    }