/*
* Copyright (C) 2014 Civilian Framework.
*
* Licensed under the Civilian License (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.civilian-framework.org/license.txt
*
* 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.civilian.form;
import static org.mockito.Mockito.*;
import java.text.ParseException;
import java.util.Locale;
import org.junit.BeforeClass;
import org.junit.Test;
import org.civilian.CivTest;
import org.civilian.Request;
import org.civilian.request.Upload;
import org.civilian.template.TestTemplateWriter;
import org.civilian.text.keys.KeyList;
import org.civilian.text.keys.KeyLists;
import org.civilian.type.TypeLib;
import org.civilian.type.fn.LocaleSerializer;
import org.civilian.util.Date;
public class ControlTest extends CivTest
{
@BeforeClass public static void beforeClass()
{
request = mock(Request.class);
when(out.response.getRequest()).thenReturn(request);
when(request.getLocaleSerializer()).thenReturn(new LocaleSerializer(Locale.ENGLISH));
}
@Test public void testSelect()
{
Select<String> select = new Select<>("name", KEYS);
assertSame(KEYS, select.getKeyList());
assertEquals(0, select.getRows());
select.setRows(1);
assertEquals(1, select.getRows());
assertSame(select, select.toFocusControl());
assertFalse(select.useOptionGroups());
select.setUseOptionGroups(true);
assertTrue(select.useOptionGroups());
select.setUseOptionGroups(false);
assertFalse(select.useOptionGroups());
assertEquals(-1, select.getSelectedIndex());
assertEquals(null, select.getSelectedText());
when(request.getParameter(select.getName())).thenReturn(null);
assertTrue(select.read(request));
select.setRequired(true);
assertFalse(select.read(request));
when(request.getParameter(select.getName())).thenReturn("a");
assertTrue(select.read(request));
assertEquals("a", select.getValue());
when(request.getParameter(select.getName())).thenReturn("x");
assertFalse(select.read(request));
assertNull(select.getValue());
assertEquals("x", select.getErrorValue());
Select<String> select2 = new Select<>("name2", KeyLists.<String>empty());
assertOut(select2, "<select name='name2'>\n\t<option value=''></option>\n</select>");
select2.removeDefaultOption();
select2.setDisabled();
select2.setRows(2);
assertOut(select2, "<select name='name2' size='2' disabled>\n</select>");
}
@Test public void testTextField()
{
TextField field = new TextField("email");
assertEquals("email", field.getName());
assertEquals("text", field.getInputType());
field.setInputType(TextField.INPUT_TYPE_EMAIL);
assertEquals("email", field.getInputType());
assertSame(field, field.toFocusControl());
assertSame(field, field.toInputField());
assertEquals(0, field.getMaxLength());
assertEquals(0, field.getSize());
field.setMaxLength(100);
assertEquals(50, field.getSize());
assertEquals(100, field.getMaxLength());
field.setSize(25);
assertEquals(25, field.getSize());
assertEquals(100, field.getMaxLength());
assertNull(field.getPattern());
field.setPattern("*@*");
assertEquals("*@*", field.getPattern());
assertNull(field.getPlaceholder());
field.setPlaceholder("enter email");
assertEquals("enter email", field.getPlaceholder());
assertNull(field.getId());
field.setId("xyz");
assertEquals("xyz", field.getId());
assertEquals("", field.getLabel());
assertFalse(field.hasLabel());
field.setLabel("label");
assertEquals("label", field.getLabel());
field.setLabel(null);
assertEquals("", field.getLabel());
assertNull(field.getData());
field.setData(this);
assertSame(this, field.getData());
assertEquals(1, field.getRows());
assertEquals(Control.Category.INPUT, field.getCategory());
assertEquals("", field.format());
assertEquals("TextField[email=null]", field.toString());
assertOut(field, "<input type='email' name='email' value='' size='25' maxlength='100' id='xyz' placeholder='enter email' pattern='*@*'>");
}
@Test public void testDateField()
{
DateField<Date> field = new DateField<>(TypeLib.DATE_CIVILIAN, "d");
field.setValue(new Date(2014, 01, 31));
assertOut(field, "<input type='text' name='d' value='20140131' size='10' maxlength='10'>");
}
@Test public void testDoubleField()
{
DoubleField field = new DoubleField("d");
field.setMin(20.0);
field.setStep(2.2);
field.setDoubleValue(40.2);
assertOut(field, "<input type='text' name='d' value='40.2' min='20.0' step='2.2'>");
}
@Test public void testIntegerField()
{
IntField field = new IntField("n");
assertOut(field, "<input type='number' name='n' value=''>");
field.setName("ifield");
when(request.getParameter("ifield")).thenReturn("a");
assertFalse(field.read(request));
assertEquals(Control.Status.PARSE_ERROR, field.getStatus());
assertTrue(field.getError() instanceof ParseException);
assertTrue(field.getError().getCause() instanceof NumberFormatException);
assertNull(field.getValue());
assertEquals("a", field.getErrorValue());
assertEquals("a", field.format());
field.setReadOnly(true);
assertFalse(field.read(request));
field.setReadOnly(false);
when(request.getParameter("ifield")).thenReturn("");
assertTrue(field.read(request));
assertEquals(null, field.getValue());
field.setRequired(true);
assertFalse(field.read(request));
assertEquals(null, field.getValue());
field = new IntField("n");
field.setMin(20);
field.setMax(30);
field.setStep(2);
assertOut(field, "<input type='number' name='n' value='' min='20' max='30' step='2'>");
}
@Test public void testTextArea()
{
TextArea field = new TextArea("area");
assertSame(field, field.toFocusControl());
assertSame(field, field.toInputField());
assertEquals(TextArea.DEFAULT_ROWS, field.getRows());
field.setRows(10);
assertEquals(10, field.getRows());
assertEquals(TextArea.DEFAULT_COLS, field.getCols());
field.setCols(100);
assertEquals(100, field.getCols());
assertEquals(null, field.getValue());
field.setValue("abc");
assertEquals("abc", field.getValue());
assertFalse(field.isReadOnly());
field.setReadOnly(true);
assertTrue(field.isReadOnly());
assertOut(field, "<textarea name='area' rows='10' cols='100' readonly>abc</textarea>");
}
@Test public void testCheckbox()
{
Checkbox field = new Checkbox("c");
assertNull(field.getText());
field.setText("gamma");
assertEquals("gamma", field.getText());
assertFalse(field.isRequired());
field.setRequired();
assertFalse(field.isRequired());
assertTrue(field.isOk());
assertSame(field, field.toFocusControl());
assertOut(field, "<label><input type='checkbox' name='c' value='on'>gamma</label>");
field = new Checkbox();
assertNull(field.getName());
field = new Checkbox("d", null);
field.setBooleanValue(true);
field.setDisabled();
field.setReadOnly(false);
assertEquals("d", field.getName());
assertEquals(null, field.getText());
assertOut(field, "<input type='checkbox' name='d' disabled checked='checked' value='on'>");
field.setDisabled(false);
field.setStatus(Checkbox.Status.VALIDATION_ERROR);
field.setBooleanValue(true);
field.read(request);
assertEquals(Checkbox.Status.OK, field.getStatus());
assertFalse(field.getBooleanValue());
setParam(field.getName(), "on");
field.read(request);
assertTrue(field.getBooleanValue());
}
@Test public void testCheckboxGroup()
{
CheckboxGroup<String> group = new CheckboxGroup<>("cg", KEYS);
assertNull(group.getValue());
assertFalse(group.isChecked("a"));
group.setValue(new String[] { "a" });
assertTrue(group.isChecked("a"));
assertFalse(group.isChecked("b"));
group.getPrinter(out).print("a", "alpha");
out.assertOutNormed("<label><input type='checkbox' name='cg' value='a' checked>alpha</label>");
group.getPrinter(out).print(null, null);
out.assertOutNormed("<input type='checkbox' name='cg' value=''>");
assertSame(KEYS, group.getKeyList());
group.getPrinter(out).print(1);
out.assertOutNormed("<label><input type='checkbox' name='cg' value='b'>beta</label>");
group.setValue(null);
group.print(out);
out.assertOutNormed("<label><input type='checkbox' name='cg' value='a'>alpha</label><br>\n<label><input type='checkbox' name='cg' value='b'>beta</label><br>\n");
}
@Test public void testRadioGroup()
{
RadioGroup<String> group = new RadioGroup<>("rg", KEYS);
assertSame(KEYS, group.getKeyList());
group.setValue("b");
group.getPrinter(out).print(null, "alpha");
out.assertOutNormed("<label><input type='radio' name='rg' value=''>alpha</label>");
group.getPrinter(out).print("b", null);
out.assertOutNormed("<input type='radio' name='rg' value='b' checked>");
group.setValue(null);
group.getPrinter(out).print(1);
out.assertOutNormed("<label><input type='radio' name='rg' value='b'>beta</label>");
group.getPrinter(out).print("b");
out.assertOutNormed("<label><input type='radio' name='rg' value='b'>beta</label>");
group.print(out);
out.assertOutNormed("<label><input type='radio' name='rg' value='a'>alpha</label>\n<label><input type='radio' name='rg' value='b'>beta</label>\n");
group.setHorizontal(false).print(out);
out.assertOutNormed("<label><input type='radio' name='rg' value='a'>alpha</label><br>\n<label><input type='radio' name='rg' value='b'>beta</label><br>\n");
}
@Test public void testHiddenField()
{
HiddenField<String> field = HiddenField.create("hidden");
assertOut(field, "<input type='hidden' name='hidden' value=''>");
assertEquals(Control.Category.HIDDEN, field.getCategory());
assertNull(field.toInputField());
field = HiddenField.create("hidden", "some");
assertEquals("some", field.getValue());
HiddenField<Integer> ihidden = new HiddenField<>(TypeLib.INTEGER, "ihidden");
ihidden.setIntValue(12);
assertOut(ihidden, "<input type='hidden' name='ihidden' value='12'>");
}
@Test public void testFileField()
{
FileField field = new FileField("photo");
Form form = new Form(request);
assertFalse(form.isMultipartEncoded());
form.add(field);
assertTrue(form.isMultipartEncoded());
assertOut(field, "<input type='file' name='photo'>");
Upload upload = mock(Upload.class);
when(request.getUploads("photo")).thenReturn(new Upload[] { upload });
field.read(request);
assertSame(upload, field.getUpload());
}
@Test public void testPasswordField()
{
PasswordField field = new PasswordField("pwd");
field.setValue("1234");
assertOut(field, "<input type='password' name='pwd' value=''>");
}
@Test public void testButton()
{
Form form = new Form(request);
Button button;
button = Button.button("OK");
assertOut(button, "<button>OK</button>");
assertEquals(null, button.getName());
form.add(button);
assertEquals(form.getName() + "_button", button.getName());
button = Button.reset("Reset");
button.setDisabled();
assertOut(button, "<button type='reset' disabled>Reset</button>");
button = Button.submit("Submit");
button.setName("submit");
assertOut(button, "<button type='submit' name='submit' value='Submit'>Submit</button>");
form.add(button);
assertEquals("submit", button.getName());
Button defaultButton = button;
assertSame(form.getDefaultButton(), button);
button = Button.inputButton("OK");
assertOut(button, "<input type='button' value='OK'>");
button = Button.inputReset("Reset");
assertOut(button, "<input type='reset' value='Reset'>");
button = Button.inputSubmit("Submit");
button.setOnClick("alert()");
assertOut(button, "<input type='submit' value='Submit' onclick='alert()'>");
button.end(out);
out.assertOut("");
form.add(button);
assertSame(defaultButton, form.getDefaultButton());
// misc
assertTrue(button.read(null));
assertEquals(Control.Category.BUTTON, button.getCategory());
assertFalse(defaultButton.isClicked());
setParam(form.getName(), "");
assertTrue(defaultButton.isClicked());
assertFalse(button.isClicked());
setParam(form.getName(), "reload");
assertFalse(defaultButton.isClicked());
setParam(defaultButton.getName(), "x");
assertFalse(defaultButton.isClicked());
setParam(defaultButton.getName(), defaultButton.getValue());
assertTrue(defaultButton.isClicked());
setParam(defaultButton.getName(), null);
assertFalse(defaultButton.isDirectlyClicked());
setParam(defaultButton.getName(), "x");
assertFalse(defaultButton.isDirectlyClicked());
setParam(defaultButton.getName(), defaultButton.getValue());
assertTrue(defaultButton.isDirectlyClicked());
}
@Test public void testFormAdd() throws Exception
{
Form form = new Form(request);
assertEquals(0, form.size());
Button button = Button.button("OK");
form.add(button);
assertEquals(1, form.size());
TextField field = new TextField("name");
form.add(field, "Name");
form.add(null); // ignored
form.add(null, "Name"); // ignored
assertEquals(2, form.size());
assertSame(field, form.get(1));
assertSame(field, form.get("name"));
assertNull(form.get("x"));
assertNull(form.get(null));
try
{
// cannot add twice
form.add(field);
fail();
}
catch(IllegalStateException e)
{
}
form.setRequired(true);
assertTrue(field.isRequired());
form.setReadOnly(true);
assertTrue(field.isReadOnly());
assertTrue(form.validate(true));
form.remove(field);
assertEquals(1, form.size());
}
@Test public void testFormRead() throws Exception
{
Form form = new Form(request);
TextField field = new TextField("name");
form.add(field, "Name");
field.setRequired(true);
form.clearErrorControl();
when(request.getRequest()).thenReturn(request);
when(request.getParameter("name")).thenReturn(null);
assertFalse(form.read());
assertFalse(form.isOk());
assertSame(field, form.getErrorControl());
when(request.getParameter("name")).thenReturn("John");
assertTrue(form.read());
assertTrue(form.isOk());
assertNull(form.getErrorControl());
}
@Test public void testFormProperties()
{
Form form = new Form(request);
assertNull(form.getTarget());
form.setTarget("blank");
assertEquals("blank", form.getTarget());
assertNull(form.getAction());
form.setAction("test.html");
assertEquals("test.html", form.getAction());
assertEquals("POST", form.getMethod());
form.setGetMethod();
assertEquals("GET", form.getMethod());
form.setPostMethod();
assertEquals("POST", form.getMethod());
assertEquals(null, form.getAttribute("onsubmit"));
form.addSubmitCallback("false");
assertEquals("return false;", form.getAttribute("onsubmit"));
form.addSubmitCallback("hello()");
assertEquals("return false & hello();", form.getAttribute("onsubmit"));
}
private void assertOut(Control<?> field, String expected)
{
field.print(out);
out.assertOutNormed(expected);
}
private void setParam(String name, String value)
{
when(request.getParameter(name)).thenReturn(value);
}
private static Request request;
private static TestTemplateWriter out = TestTemplateWriter.create();
private static KeyList<String> KEYS = KeyLists.forContent(new String[]{ "a", "b"}, new String[]{ "alpha", "beta"});
}