001    // Copyright 2005 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    
015    package org.apache.tapestry.components;
016    
017    import static org.easymock.EasyMock.expect;
018    import static org.easymock.EasyMock.expectLastCall;
019    
020    import org.apache.tapestry.BaseComponentTestCase;
021    import org.apache.tapestry.IActionListener;
022    import org.apache.tapestry.IMarkupWriter;
023    import org.apache.tapestry.IRequestCycle;
024    import org.apache.tapestry.listener.ListenerInvoker;
025    import org.testng.annotations.Test;
026    
027    /**
028     * Tests for {@link org.apache.tapestry.components.InvokeListener}.
029     * 
030     * @author Howard M. Lewis Ship
031     * @since 4.0
032     */
033    @Test
034    public class TestInvokeListener extends BaseComponentTestCase
035    {
036        private IActionListener newListener()
037        {
038            return newMock(IActionListener.class);
039        }
040    
041        private ListenerInvoker newInvoker()
042        {
043            return newMock(ListenerInvoker.class);
044        }
045    
046        public void testSuccess()
047        {
048            IMarkupWriter writer = newWriter();
049            IRequestCycle cycle = newMock(IRequestCycle.class);
050    
051            IActionListener listener = newListener();
052            ListenerInvoker invoker = newInvoker();
053    
054            Object[] parameters = new Object[0];
055            
056            InvokeListener component = newInstance(InvokeListener.class, 
057                    new Object[] { 
058                "listener", listener, 
059                "parameters", parameters, 
060                "listenerInvoker", invoker, 
061            });
062            
063            expect(cycle.renderStackPush(component)).andReturn(component);
064            
065            cycle.setListenerParameters(parameters);
066            invoker.invokeListener(listener, component, cycle);
067            cycle.setListenerParameters(null);
068    
069            expect(cycle.renderStackPop()).andReturn(component);
070            
071            replay();
072    
073            component.render(writer, cycle);
074    
075            verify();
076        }
077    
078        public void testEnsureParametersClearedAfterException()
079        {
080            IMarkupWriter writer = newWriter();
081            IRequestCycle cycle = newMock(IRequestCycle.class);
082            
083            IActionListener listener = newListener();
084            
085            ListenerInvoker invoker = newMock(ListenerInvoker.class);
086    
087            Throwable t = new RuntimeException();
088    
089            Object[] parameters = new Object[0];
090            
091            InvokeListener component = newInstance(InvokeListener.class, 
092                    new Object[] { 
093                "listener", listener, 
094                "parameters", parameters, 
095                "listenerInvoker", invoker, 
096            });
097            
098            expect(cycle.renderStackPush(component)).andReturn(component);
099            
100            cycle.setListenerParameters(parameters);
101    
102            invoker.invokeListener(listener, component, cycle);
103            expectLastCall().andThrow(t);
104            
105            cycle.setListenerParameters(null);
106            
107            expect(cycle.renderStackPop()).andReturn(component);
108            
109            replay();
110    
111            try
112            {
113                component.render(writer, cycle);
114                unreachable();
115            }
116            catch (RuntimeException ex)
117            {
118                assertSame(t, ex);
119            }
120    
121            verify();
122        }
123    }