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.form;
016    
017    import org.apache.tapestry.IBinding;
018    import org.apache.tapestry.IForm;
019    import org.apache.tapestry.IMarkupWriter;
020    import org.apache.tapestry.IRequestCycle;
021    import org.apache.tapestry.spec.ComponentSpecification;
022    import org.apache.tapestry.valid.IValidationDelegate;
023    import org.apache.tapestry.valid.ValidatorException;
024    import static org.easymock.EasyMock.expect;
025    import static org.easymock.EasyMock.expectLastCall;
026    import org.testng.annotations.Test;
027    
028    /**
029     * Tests for {@link org.apache.tapestry.form.TextArea}.
030     * 
031     * @author Howard M. Lewis Ship
032     * @since 4.0
033     */
034    @Test(sequential=true)
035    public class TestTextArea extends BaseFormComponentTestCase
036    {
037        public void testRewind()
038        {
039            TranslatedFieldSupport tfs = newMock(TranslatedFieldSupport.class);
040            ValidatableFieldSupport vfs = newMock(ValidatableFieldSupport.class);
041    
042            TextArea component = newInstance(TextArea.class, new Object[]
043            { "translatedFieldSupport", tfs, "validatableFieldSupport", vfs });
044            
045            IRequestCycle cycle = newCycle();
046            IForm form = newMock(IForm.class);
047    
048            IMarkupWriter writer = newWriter();
049    
050            IValidationDelegate delegate = newDelegate();
051            
052            expect(cycle.renderStackPush(component)).andReturn(component);
053            
054            trainGetForm(cycle, form);
055            trainWasPrerendered(form, writer, component, false);
056            trainGetDelegate(form, delegate);
057    
058            delegate.setFormComponent(component);
059    
060            trainGetElementId(form, component, "barney");
061            trainIsRewinding(form, true);
062    
063            trainGetParameter(cycle, "barney", " text area value ");
064    
065            try
066            {
067                expect(tfs.parse(component, " text area value ")).andReturn("text area value");
068            
069                vfs.validate(component, writer, cycle, "text area value");
070            }
071            catch (ValidatorException e)
072            {
073                unreachable();
074            }
075            
076            expect(cycle.renderStackPop()).andReturn(component);
077            
078            replay();
079    
080            component.render(writer, cycle);
081    
082            verify();
083            
084            assertEquals("text area value", component.getValue());
085        }
086    
087        @SuppressWarnings("ALL")
088        public void testRewindTranslateFailed()
089        {
090            TranslatedFieldSupport tfs = newMock(TranslatedFieldSupport.class);
091            ValidatableFieldSupport vfs = newMock(ValidatableFieldSupport.class);
092    
093            TextArea component = newInstance(TextArea.class, "translatedFieldSupport", tfs, "validatableFieldSupport", vfs);
094            
095            IRequestCycle cycle = newCycle();
096            IForm form = newMock(IForm.class);
097    
098            IMarkupWriter writer = newWriter();
099    
100            IValidationDelegate delegate = newDelegate();
101            
102            expect(cycle.renderStackPush(component)).andReturn(component);
103            
104            trainGetForm(cycle, form);
105            trainWasPrerendered(form, writer, component, false);
106            trainGetDelegate(form, delegate);
107    
108            delegate.setFormComponent(component);
109    
110            trainGetElementId(form, component, "barney");
111            trainIsRewinding(form, true);
112    
113            trainGetParameter(cycle, "barney", " text area value ");
114    
115            ValidatorException exception = new ValidatorException("test");
116            
117            try
118            {
119                expect(tfs.parse(component, " text area value ")).andThrow(exception);
120            }
121            catch (ValidatorException e)
122            {
123                unreachable();
124            }
125            
126            delegate.record(exception);
127            
128            expect(cycle.renderStackPop()).andReturn(component);
129            
130            replay();
131    
132            component.render(writer, cycle);
133            
134            verify();
135            
136            assertNull(component.getValue());
137        }
138    
139        @SuppressWarnings("ALL")
140        public void testRewindValidateFailed()
141        {
142            TranslatedFieldSupport tfs = newMock(TranslatedFieldSupport.class);
143            ValidatableFieldSupport vfs = newMock(ValidatableFieldSupport.class);
144    
145            TextArea component = newInstance(TextArea.class, "translatedFieldSupport", tfs, "validatableFieldSupport", vfs);
146            
147            IRequestCycle cycle = newCycle();
148            IForm form = newMock(IForm.class);
149    
150            IMarkupWriter writer = newWriter();
151    
152            IValidationDelegate delegate = newDelegate();
153            
154            expect(cycle.renderStackPush(component)).andReturn(component);
155            
156            trainGetForm(cycle, form);
157            trainWasPrerendered(form, writer, component, false);
158            trainGetDelegate(form, delegate);
159    
160            delegate.setFormComponent(component);
161    
162            trainGetElementId(form, component, "barney");
163            trainIsRewinding(form, true);
164    
165            trainGetParameter(cycle, "barney", " text area value ");
166    
167            ValidatorException exception = new ValidatorException("test");
168            
169            try
170            {
171                expect(tfs.parse(component, " text area value ")).andReturn("text area value");
172                
173                vfs.validate(component, writer, cycle, "text area value");
174                expectLastCall().andThrow(exception);
175            }
176            catch (ValidatorException e)
177            {
178                unreachable();
179            }
180            
181            delegate.record(exception);
182            
183            expect(cycle.renderStackPop()).andReturn(component);
184            
185            replay();
186    
187            component.render(writer, cycle);
188            
189            verify();
190            
191            assertNull(component.getValue());
192        }
193    
194        public void testWasPrerendered()
195        {
196            TextArea component = (TextArea) newInstance(TextArea.class);
197            IRequestCycle cycle = newCycle();
198            IForm form = newMock(IForm.class);
199    
200            IMarkupWriter writer = newWriter();
201            
202            expect(cycle.renderStackPush(component)).andReturn(component);
203            
204            trainGetForm(cycle, form);
205            trainWasPrerendered(form, writer, component, true);
206    
207            expect(cycle.renderStackPop()).andReturn(component);
208            
209            replay();
210    
211            component.render(writer, cycle);
212    
213            verify();
214        }
215    
216        public void testRewindNotForm()
217        {
218            TextArea component = (TextArea) newInstance(TextArea.class);
219            IRequestCycle cycle = newCycle();
220            IForm form = newMock(IForm.class);
221    
222            IMarkupWriter writer = newWriter();
223    
224            IValidationDelegate delegate = newDelegate();
225            
226            expect(cycle.renderStackPush(component)).andReturn(component);
227            
228            trainGetForm(cycle, form);
229            trainWasPrerendered(form, writer, component, false);
230            trainGetDelegate(form, delegate);
231    
232            delegate.setFormComponent(component);
233    
234            trainGetElementId(form, component, "barney");
235            trainIsRewinding(form, false);
236            trainIsRewinding(cycle, true);
237            
238            expect(cycle.renderStackPop()).andReturn(component);
239            
240            replay();
241    
242            component.render(writer, cycle);
243    
244            verify();
245        }
246    
247        public void testRewindDisabled()
248        {
249            TextArea component = (TextArea) newInstance(TextArea.class, "disabled", Boolean.TRUE);
250            IRequestCycle cycle = newCycle();
251            IForm form = newMock(IForm.class);
252    
253            IMarkupWriter writer = newWriter();
254    
255            IValidationDelegate delegate = newDelegate();
256            
257            expect(cycle.renderStackPush(component)).andReturn(component);
258            
259            trainGetForm(cycle, form);
260            trainWasPrerendered(form, writer, component, false);
261            trainGetDelegate(form, delegate);
262    
263            delegate.setFormComponent(component);
264    
265            trainGetElementId(form, component, "barney");
266            trainIsRewinding(form, true);
267            
268            expect(cycle.renderStackPop()).andReturn(component);
269            
270            replay();
271    
272            component.render(writer, cycle);
273    
274            assertNull(component.getValue());
275    
276            verify();
277        }
278    
279        public void testRender()
280        {
281            TranslatedFieldSupport tfs = newMock(TranslatedFieldSupport.class);
282            ValidatableFieldSupport vfs = newMock(ValidatableFieldSupport.class);
283            
284            IRequestCycle cycle = newCycle();
285            IForm form = newMock(IForm.class);
286    
287            IMarkupWriter writer = newBufferWriter();
288    
289            MockDelegate delegate = new MockDelegate();
290    
291            TextArea component = newInstance(TextArea.class,
292                                             "name", "fred",
293                                             "translatedFieldSupport", tfs,
294                                             "validatableFieldSupport", vfs,
295                                             "value", " text area value ");
296            
297            expect(cycle.renderStackPush(component)).andReturn(component);
298            
299            trainGetForm(cycle, form);
300            trainWasPrerendered(form, writer, component, false);
301            trainGetDelegate(form, delegate);
302    
303            delegate.setFormComponent(component);
304    
305            trainGetElementId(form, component, "fred");
306            trainIsRewinding(form, false);
307            trainIsRewinding(cycle, false);
308    
309            form.setFormFieldUpdating(true);
310            delegate.setFormComponent(component);
311    
312            expect(tfs.format(component, " text area value ")).andReturn("text area value");
313            tfs.renderContributions(component, writer, cycle);
314            vfs.renderContributions(component, writer, cycle);
315            
316            expect(cycle.renderStackPop()).andReturn(component);
317            
318            replay();
319    
320            component.render(writer, cycle);
321    
322            verify();
323    
324            assertBuffer("<span class=\"prefix\"><textarea name=\"fred\" id=\"fred\" class=\"validation-delegate\">text area value</textarea></span>");
325        }
326    
327        public void testRenderDisabled()
328        {
329            TranslatedFieldSupport tfs = newMock(TranslatedFieldSupport.class);
330            ValidatableFieldSupport vfs = newMock(ValidatableFieldSupport.class);
331            
332            IRequestCycle cycle = newCycle();
333            IForm form = newMock(IForm.class);
334    
335            IMarkupWriter writer = newBufferWriter();
336    
337            MockDelegate delegate = new MockDelegate();
338    
339            TextArea component = newInstance(TextArea.class,
340                                             "name", "fred",
341                                             "translatedFieldSupport", tfs,
342                                             "validatableFieldSupport", vfs,
343                                             "value", " text area value ",
344                                             "disabled", Boolean.TRUE);
345            
346            expect(cycle.renderStackPush(component)).andReturn(component);
347            
348            trainGetForm(cycle, form);
349            trainWasPrerendered(form, writer, component, false);
350            trainGetDelegate(form, delegate);
351    
352            delegate.setFormComponent(component);
353    
354            trainGetElementId(form, component, "fred");
355            trainIsRewinding(form, false);
356            trainIsRewinding(cycle, false);
357    
358            form.setFormFieldUpdating(true);
359            
360            delegate.setFormComponent(component);
361            
362            expect(tfs.format(component, " text area value ")).andReturn("text area value");
363            tfs.renderContributions(component, writer, cycle);
364            vfs.renderContributions(component, writer, cycle);
365            
366            expect(cycle.renderStackPop()).andReturn(component);
367            
368            replay();
369    
370            component.render(writer, cycle);
371    
372            verify();
373    
374            assertBuffer("<span class=\"prefix\"><textarea name=\"fred\" disabled=\"disabled\" id=\"fred\" class=\"validation-delegate\">text area value</textarea></span>");
375        }
376    
377        public void testRenderWithInformalParameters()
378        {
379            TranslatedFieldSupport tfs = newMock(TranslatedFieldSupport.class);
380            ValidatableFieldSupport vfs = newMock(ValidatableFieldSupport.class);
381            
382            IRequestCycle cycle = newCycle();
383            IForm form = newMock(IForm.class);
384    
385            IMarkupWriter writer = newBufferWriter();
386    
387            MockDelegate delegate = new MockDelegate();
388    
389            IBinding binding = newBinding("informal-value");
390    
391            TextArea component = newInstance(TextArea.class,
392                                             "name", "fred",
393                                             "translatedFieldSupport", tfs,
394                                             "validatableFieldSupport", vfs,
395                                             "value", " text area value ",
396                                             "specification", new ComponentSpecification());
397    
398            component.setBinding("informal", binding);
399            
400            expect(cycle.renderStackPush(component)).andReturn(component);
401            
402            trainGetForm(cycle, form);
403            trainWasPrerendered(form, writer, component, false);
404            trainGetDelegate(form, delegate);
405    
406            delegate.setFormComponent(component);
407    
408            trainGetElementId(form, component, "fred");
409            trainIsRewinding(form, false);
410            trainIsRewinding(cycle, false);
411    
412            form.setFormFieldUpdating(true);
413            
414            delegate.setFormComponent(component);
415    
416            expect(tfs.format(component, " text area value ")).andReturn("text area value");
417            
418            tfs.renderContributions(component, writer, cycle);
419            vfs.renderContributions(component, writer, cycle);
420            
421            expect(cycle.renderStackPop()).andReturn(component);
422            
423            replay();
424    
425            component.render(writer, cycle);
426    
427            verify();
428    
429            assertBuffer("<span class=\"prefix\"><textarea name=\"fred\" id=\"fred\" class=\"validation-delegate\" informal=\"informal-value\">text area value</textarea></span>");
430        }
431    
432        public void testRenderNullValue()
433        {
434            TranslatedFieldSupport tfs = newMock(TranslatedFieldSupport.class);
435            ValidatableFieldSupport vfs = newMock(ValidatableFieldSupport.class);
436            
437            IRequestCycle cycle = newCycle();
438            IForm form = newMock(IForm.class);
439    
440            IMarkupWriter writer = newBufferWriter();
441    
442            MockDelegate delegate = new MockDelegate();
443    
444            TextArea component = newInstance(TextArea.class,
445                                             "name", "fred",
446                                             "translatedFieldSupport", tfs,
447                                             "validatableFieldSupport", vfs);
448            
449            expect(cycle.renderStackPush(component)).andReturn(component);
450            
451            trainGetForm(cycle, form);
452            trainWasPrerendered(form, writer, component, false);
453            trainGetDelegate(form, delegate);
454    
455            delegate.setFormComponent(component);
456    
457            trainGetElementId(form, component, "fred");
458            trainIsRewinding(form, false);
459            trainIsRewinding(cycle, false);
460    
461            form.setFormFieldUpdating(true);
462            
463            delegate.setFormComponent(component);
464    
465            expect(tfs.format(component, null)).andReturn("");        
466            tfs.renderContributions(component, writer, cycle);
467            vfs.renderContributions(component, writer, cycle);
468            
469            expect(cycle.renderStackPop()).andReturn(component);
470            
471            replay();
472    
473            component.render(writer, cycle);
474    
475            verify();
476    
477            assertBuffer("<span class=\"prefix\"><textarea name=\"fred\" id=\"fred\" class=\"validation-delegate\"></textarea></span>");
478        }
479    }