001    // Copyright May 20, 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.annotations;
015    
016    import org.apache.hivemind.ApplicationRuntimeException;
017    import org.apache.hivemind.Resource;
018    import org.apache.tapestry.enhance.EnhancementOperation;
019    import org.apache.tapestry.internal.event.ComponentEventProperty;
020    import org.apache.tapestry.internal.event.EventBoundListener;
021    import org.apache.tapestry.spec.ComponentSpecification;
022    import org.apache.tapestry.spec.IComponentSpecification;
023    import org.testng.annotations.Test;
024    
025    import java.lang.reflect.Method;
026    import java.util.List;
027    
028    
029    /**
030     * Tests functionality of {@link TestEventListenerAnnotationWorker}.
031     * @author jkuhnert
032     */
033    @Test
034    public class TestEventListenerAnnotationWorker extends BaseAnnotationTestCase
035    {
036    
037        public void test_Event_Connection()
038        {
039            EnhancementOperation op = newOp();
040            IComponentSpecification spec = new ComponentSpecification();
041            Resource resource = newResource(AnnotatedPage.class);
042            
043            EventListenerAnnotationWorker worker = new EventListenerAnnotationWorker();
044    
045            replay();
046            
047            Method m = findMethod(AnnotatedPage.class, "eventListener");
048            
049            assertTrue(worker.canEnhance(m));
050            assertFalse(worker.canEnhance(findMethod(AnnotatedPage.class, "getPersistentProperty")));
051            worker.peformEnhancement(op, spec, m, resource);
052            
053            verify();
054                    
055            ComponentEventProperty property = spec.getComponentEvents("email");
056            assertNotNull(property);
057            
058            List listeners = property.getEventListeners("onClick");
059            assertNotNull(listeners);
060            assertEquals(1, listeners.size());
061            
062            property = spec.getElementEvents("foo");
063            assertNotNull(property);
064            
065            listeners = property.getEventListeners("onClick");
066            assertNotNull(listeners);
067            assertEquals(1, listeners.size());
068            
069            assert !((EventBoundListener)listeners.get(0)).shouldFocusForm();
070            assert ((EventBoundListener)listeners.get(0)).isAutoSubmit();
071        }
072        
073        public void test_Form_Event_Connection()
074        {
075            EnhancementOperation op = newOp();
076            IComponentSpecification spec = new ComponentSpecification();
077            Resource resource = newResource(AnnotatedPage.class);
078    
079            EventListenerAnnotationWorker worker = new EventListenerAnnotationWorker();
080    
081            replay();
082            
083            Method m = findMethod(AnnotatedPage.class, "formListener");
084            
085            assertTrue(worker.canEnhance(m));
086            worker.peformEnhancement(op, spec, m, resource);
087            
088            verify();
089                    
090            ComponentEventProperty property = spec.getComponentEvents("email");
091            assertNotNull(property);
092            
093            List listeners = property.getFormEventListeners("onClick");
094            assertNotNull(listeners);
095            assertEquals(1, listeners.size());
096            
097            EventBoundListener formListener = (EventBoundListener)listeners.get(0);
098            assertEquals("testForm", formListener.getFormId());
099            assertFalse(formListener.isValidateForm());
100            assert formListener.shouldFocusForm();
101            assert formListener.isAutoSubmit();
102        }
103        
104        public void test_Targets_Not_Found()
105        {
106            EnhancementOperation op = newOp();
107            IComponentSpecification spec = newSpec();
108            Resource resource = newResource(AnnotatedPage.class);
109            
110            EventListenerAnnotationWorker worker = new EventListenerAnnotationWorker();
111            
112            replay();
113            
114            Method m = findMethod(AnnotatedPage.class, "brokenTargetListener");
115            
116            assertTrue(worker.canEnhance(m));
117            
118            try {
119                worker.peformEnhancement(op, spec, m, resource);
120                unreachable();
121            } catch (ApplicationRuntimeException e) {
122                assertExceptionSubstring(e, "No targets found for");
123            }
124            
125            verify();
126        }
127        
128        public void test_Can_Enhance()
129        {
130            EventListenerAnnotationWorker worker = new EventListenerAnnotationWorker();
131            
132            replay();
133            
134            Method m = findMethod(AnnotatedPage.class, "getDefaultPageSize");
135            
136            assertFalse(worker.canEnhance(m));
137            
138            verify();
139        }
140    
141    
142        public void test_Disable_Aysnc_Event_Connection()
143        {
144            EnhancementOperation op = newOp();
145            IComponentSpecification spec = new ComponentSpecification();
146            Resource resource = newResource(AnnotatedPage.class);
147    
148            EventListenerAnnotationWorker worker = new EventListenerAnnotationWorker();
149    
150            replay();
151    
152            Method m = findMethod(AnnotatedPage.class, "submitForm");
153    
154            assertTrue(worker.canEnhance(m));
155            worker.peformEnhancement(op, spec, m, resource);
156    
157            verify();
158    
159            ComponentEventProperty property = spec.getComponentEvents("foo");
160            assertNotNull(property);
161    
162            List listeners = property.getEventListeners("onchange");
163            assertNotNull(listeners);
164            assertEquals(1, listeners.size());
165    
166            EventBoundListener listener = (EventBoundListener) listeners.get(0);
167            assert !listener.shouldFocusForm();
168            assert !listener.isAsync();
169        }
170    }