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 }