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 }