/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.wicket.markup.html.form;
import org.apache.wicket.Page;
import org.apache.wicket.markup.IMarkupFragment;
import org.apache.wicket.markup.Markup;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.model.Model;
import org.apache.wicket.util.tester.WicketTestCase;
import org.junit.Test;
/**
* Tests {@code wicket:for} attribute functionality
*
* @author igor
*/
public class AutoLabelTest extends WicketTestCase
{
/** */
@Test
public void labelIntoMarkupInsertion()
{
class MyTestPage extends TestPage
{
private static final long serialVersionUID = 1L;
public MyTestPage(String labelMarkup)
{
super("<label wicket:for='t'>" + labelMarkup + "</label>");
field.setLabel(Model.of("t"));
}
}
// simple insertion
assertRendered(new MyTestPage("<wicket:label>text</wicket:label>"), ">t</label>");
// preserves markup before and after
assertRendered(new MyTestPage(" <div> a </div> <wicket:label>text</wicket:label> b "),
" <div> a </div> t b ");
// embedded span tags
assertRendered(new MyTestPage(" a <div> b <wicket:label>text</wicket:label> c </div> d"),
" a <div> b t c </div> d");
// no span - no insertion
assertRendered(new MyTestPage(" text "), " text ");
// empty label tag
assertRendered(new MyTestPage(""), "></label>");
// empty span tag
assertRendered(new MyTestPage("<wicket:label></wicket:label>"), ">t</label>");
// open/close span tag
assertRendered(new MyTestPage("<wicket:label/>"), ">t</label>");
}
/** */
@Test
public void markupIntoLabelInsertion()
{
class MyTestPage extends TestPage
{
private static final long serialVersionUID = 1L;
public MyTestPage(String labelMarkup)
{
super("<label wicket:for='t'>" + labelMarkup + "</label>");
}
}
// test form component label is defaulted to the contents of span class='label-text'
MyTestPage page = new MyTestPage("<wicket:label>text</wicket:label>");
tester.startPage(page);
assertEquals("text", ((MyTestPage)tester.getLastRenderedPage()).field.getLabel()
.getObject());
}
/** */
@Test
public void labelTagClasses()
{
class MyTestPage extends TestPage
{
private static final long serialVersionUID = 1L;
public MyTestPage()
{
super("<label wicket:for='t'><span class='label-text'>field</span></label>");
}
}
class MyErrorTestPage extends MyTestPage
{
private static final long serialVersionUID = 1L;
@Override
protected void onConfigure()
{
super.onConfigure();
field.error("too short");
}
}
// test required class
TestPage page = new MyTestPage();
assertNotRendered(page, "class='required'");
page.field.setRequired(true);
assertRendered(page, "class='required'");
// test error class
page = new MyTestPage();
assertNotRendered(page, "class='error'");
page = new MyErrorTestPage();
assertRendered(page, "class='error'");
// test classes are appended and not overridden
page = new MyErrorTestPage();
page.field.setRequired(true);
tester.startPage(page);
String markup = tester.getLastResponse().getDocument();
assertTrue(markup.contains("class=\"required error\"") ||
markup.contains("class=\"error required\""));
// test existing classes are preserved
class MyTestPage2 extends TestPage
{
private static final long serialVersionUID = 1L;
public MyTestPage2()
{
super(
"<label class='long' wicket:for='t'><wicket:label>field</wicket:label></label>");
}
}
MyTestPage2 page2 = new MyTestPage2();
page2.field.setRequired(true);
tester.startPage(page2);
markup = tester.getLastResponse().getDocument();
assertTrue(markup.contains("class=\"required long\"") ||
markup.contains("class=\"long required\""));
}
private void assertRendered(Page page, String markupFragment)
{
tester.startPage(page);
String markup = tester.getLastResponse().getDocument();
markup = markup.replace("'", "\"");
assertTrue("fragment: [" + markupFragment + "] not found in generated markup: [" + markup +
"]", markup.contains(markupFragment.replace("'", "\"")));
}
private void assertNotRendered(Page page, String markupFragment)
{
tester.startPage(page);
String markup = tester.getLastResponse().getDocument();
markup = markup.replace("'", "\"");
assertFalse("fragment: [" + markupFragment + "] not found in generated markup: [" + markup +
"]", markup.contains(markupFragment.replace("'", "\"")));
}
private static class TestPage extends WebPage
{
private static final long serialVersionUID = 1L;
TextField<String> field;
private final String labelMarkup;
public TestPage(String labelMarkup)
{
this.labelMarkup = labelMarkup;
Form<?> form = new Form<Void>("f");
add(form);
form.add(field = new TextField<String>("t", Model.of("")));
}
@Override
public IMarkupFragment getMarkup()
{
return Markup.of("<html><body><form wicket:id='f'>\n" + labelMarkup +
"\n<input type='text' wicket:id='t'/>\n</form></body></html>");
}
}
}