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.valid;
016    
017    import org.apache.hivemind.Location;
018    import org.apache.tapestry.BindingException;
019    import org.apache.tapestry.IForm;
020    import org.apache.tapestry.IMarkupWriter;
021    import org.apache.tapestry.IRequestCycle;
022    import org.apache.tapestry.form.BaseFormComponentTestCase;
023    import org.apache.tapestry.form.IFormComponent;
024    import static org.easymock.EasyMock.checkOrder;
025    import static org.easymock.EasyMock.expect;
026    import org.testng.annotations.Test;
027    
028    /**
029     * Tests for the {@link org.apache.tapestry.valid.FieldLabel} component.
030     *
031     * @author Howard M. Lewis Ship
032     * @since 4.0
033     */
034    @Test(sequential=true)
035    public class FieldLabelTest extends BaseFormComponentTestCase
036    {
037        private IForm newForm(IValidationDelegate delegate)
038        {
039            IForm form = newMock(IForm.class);
040            checkOrder(form, false);
041    
042            trainGetDelegate(delegate, form);
043    
044            return form;
045        }
046    
047        private void trainGetDelegate(IValidationDelegate delegate, IForm form)
048        {
049            expect(form.getDelegate()).andReturn(delegate);
050        }
051    
052        private IFormComponent newField(String displayName, String clientId)
053        {
054            IFormComponent field = newMock(IFormComponent.class);
055            checkOrder(field, false);
056    
057            trainGetDisplayName(field, displayName);
058            trainGetClientId(clientId, field);
059    
060            return field;
061        }
062    
063        private void trainGetClientId(String clientId, IFormComponent field)
064        {
065            expect(field.getClientId()).andReturn(clientId).anyTimes();
066        }
067    
068        private void trainGetDisplayName(IFormComponent field, String displayName)
069        {
070            expect(field.getDisplayName()).andReturn(displayName).anyTimes();
071        }
072    
073        public void test_Rewinding()
074        {
075            Location l = newLocation();
076            IMarkupWriter writer = newWriter();
077            IRequestCycle cycle = newCycle();
078            IForm form = newForm();
079            IFormComponent field = newField();
080    
081            FieldLabel fl = newInstance(FieldLabel.class, "field", field,
082                                        "location", l, "prerender", true);
083    
084            expect(cycle.renderStackPush(fl)).andReturn(fl);
085            trainGetForm(cycle, form);
086            form.prerenderField(writer, field, l);
087            trainIsRewinding(cycle, true);
088    
089            expect(cycle.renderStackPop()).andReturn(fl);
090    
091            replay();
092    
093            fl.render(writer, cycle);
094    
095            verify();
096        }
097    
098        public void test_Null_Field()
099        {
100            IValidationDelegate delegate = new MockDelegate();
101            IForm form = newForm(delegate);
102            IMarkupWriter writer = newBufferWriter();
103            IRequestCycle cycle = newCycle();
104    
105            FieldLabel fl = newInstance(FieldLabel.class,
106                                        new Object[] { "displayName", "FredFlintstone" });
107    
108            expect(cycle.renderStackPush(fl)).andReturn(fl);
109    
110            trainGetForm(cycle, form);
111    
112            trainIsRewinding(cycle, false);
113    
114            expect(cycle.renderStackPop()).andReturn(fl);
115    
116            replay();
117    
118            fl.render(writer, cycle);
119    
120            assertBuffer("<label>{BEFORE-TEXT}FredFlintstone{AFTER-TEXT}</label>");
121    
122            verify();
123        }
124    
125        public void test_Null_Field_Raw()
126        {
127            IValidationDelegate delegate = new MockDelegate();
128            IForm form = newForm(delegate);
129            IMarkupWriter writer = newBufferWriter();
130            IRequestCycle cycle = newCycle();
131    
132            FieldLabel fl = newInstance(FieldLabel.class, "displayName", "<b>FredFlintstone</b>",
133                                        "raw", Boolean.TRUE);
134    
135            expect(cycle.renderStackPush(fl)).andReturn(fl);
136    
137            trainGetForm(cycle, form);
138            trainIsRewinding(cycle, false);
139    
140            expect(cycle.renderStackPop()).andReturn(fl);
141    
142            replay();
143    
144            fl.render(writer, cycle);
145    
146            assertBuffer("<label>{BEFORE-TEXT}<b>FredFlintstone</b>{AFTER-TEXT}</label>");
147    
148            verify();
149        }
150    
151        public void test_No_Field_Or_DisplayName()
152        {
153            IForm form = newForm();
154            IMarkupWriter writer = newWriter();
155            IRequestCycle cycle = newCycle();
156    
157            FieldLabel fl = newInstance(FieldLabel.class, new Object[] {"id", "label"});
158    
159            expect(cycle.renderStackPush(fl)).andReturn(fl);
160    
161            trainGetForm(cycle, form);
162            trainIsRewinding(cycle, false);
163    
164            expect(cycle.renderStackPop()).andReturn(fl);
165    
166            replay();
167    
168            try
169            {
170                fl.render(writer, cycle);
171                unreachable();
172            }
173            catch (BindingException ex)
174            {
175                assertEquals("Value for parameter 'field' in component "
176                             + "null is null, and a non-null value is required.",
177                             ex.getMessage());
178            }
179    
180            verify();
181        }
182    
183        public void test_Display_Name_From_Field()
184        {
185            IValidationDelegate delegate = new MockDelegate();
186    
187            IForm form = newForm();
188    
189            IMarkupWriter writer = newBufferWriter();
190            IFormComponent field = newField("MyLabel", null);
191            Location l = newLocation();
192    
193            IRequestCycle cycle = newCycle();
194    
195            FieldLabel fl = newInstance(FieldLabel.class, "location", l,
196                                        "field", field, "prerender", true);
197    
198            expect(cycle.renderStackPush(fl)).andReturn(fl);
199    
200            trainGetForm(cycle, form);
201            trainIsRewinding(cycle, false);
202    
203            form.prerenderField(writer, field, l);
204            trainGetDelegate(form, delegate);
205    
206            expect(cycle.renderStackPop()).andReturn(fl);
207    
208            replay();
209    
210            fl.render(writer, cycle);
211    
212            assertBuffer("{LABEL-PREFIX}<label>{BEFORE-TEXT}MyLabel{AFTER-TEXT}</label>{LABEL-SUFFIX}");
213    
214            verify();
215        }
216    
217        public void test_Prerender_Off()
218        {
219            IValidationDelegate delegate = new MockDelegate();
220    
221            IForm form = newForm();
222    
223            IMarkupWriter writer = newBufferWriter();
224            IFormComponent field = newField("MyLabel", null);
225            Location l = newLocation();
226    
227            IRequestCycle cycle = newCycle();
228    
229            FieldLabel fl = newInstance(FieldLabel.class, "location", l, "field", field);
230    
231            expect(cycle.renderStackPush(fl)).andReturn(fl);
232    
233            trainGetForm(cycle, form);
234            trainIsRewinding(cycle, false);
235            trainGetDelegate(form, delegate);
236    
237            expect(cycle.renderStackPop()).andReturn(fl);
238    
239            replay();
240    
241            fl.render(writer, cycle);
242    
243            assertBuffer("{LABEL-PREFIX}<label>{BEFORE-TEXT}MyLabel{AFTER-TEXT}</label>{LABEL-SUFFIX}");
244    
245            verify();
246        }
247    
248        public void test_Field_With_Client_Id()
249        {
250            IValidationDelegate delegate = new MockDelegate();
251    
252            IForm form = newForm();
253    
254            IMarkupWriter writer = newBufferWriter();
255    
256            Location l = newLocation();
257    
258            IRequestCycle cycle = newCycle();
259    
260            IFormComponent field = newField("MyLabel", "clientId");
261            
262            FieldLabel fl = newInstance(FieldLabel.class, "location", l,
263                                        "field", field, "prerender", true);
264    
265            expect(cycle.renderStackPush(fl)).andReturn(fl);
266    
267            trainGetForm(cycle, form);
268            form.prerenderField(writer, field, l);
269            trainIsRewinding(cycle, false);
270            trainGetDelegate(form, delegate);
271    
272            expect(cycle.renderStackPop()).andReturn(fl);
273    
274            replay();
275    
276            fl.render(writer, cycle);
277    
278            assertBuffer("{LABEL-PREFIX}<label for=\"clientId\">{BEFORE-TEXT}MyLabel{AFTER-TEXT}</label>{LABEL-SUFFIX}");
279    
280            verify();
281        }
282    
283        public void test_No_Display_Name_In_Field()
284        {
285            IForm form = newForm();
286            IMarkupWriter writer = newBufferWriter();
287            IFormComponent field = newField();
288            Location l = newLocation();
289    
290            IRequestCycle cycle = newCycle();
291    
292            FieldLabel fl = newInstance(FieldLabel.class, "id", "label",
293                                        "location", l,
294                                        "field", field,
295                                        "prerender", true);
296    
297            expect(cycle.renderStackPush(fl)).andReturn(fl);
298    
299            trainGetForm(cycle, form);
300            form.prerenderField(writer, field, l);
301            trainIsRewinding(cycle, false);
302            trainGetDisplayName(field, null);
303            trainGetExtendedId(field, "Fred/field");
304    
305            expect(cycle.renderStackPop()).andReturn(fl);
306    
307            replay();
308    
309            try
310            {
311                fl.render(writer, cycle);
312                unreachable();
313            }
314            catch (BindingException ex)
315            {
316                assertEquals(
317                  "Display name for null was not specified and was not provided by field Fred/field.",
318                  ex.getMessage());
319            }
320    
321            verify();
322        }
323    }