package javango.forms.widgets;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.google.inject.Inject;
import javango.forms.AbstractForm;
import javango.forms.Form;
import javango.forms.fields.BoundField;
import javango.forms.fields.ChoiceField;
import javango.forms.fields.Field;
import javango.forms.fields.FieldFactory;
import javango.forms.fields.SelectField;
import javango.forms.fields.annotations.CharFieldProperties;
import javango.forms.fields.annotations.Choice;
import javango.forms.fields.annotations.ChoiceFieldProperties;
import javango.forms.fields.annotations.FieldProperties;
import javango.forms.tests.InjectedTestCaseBase;
import javango.forms.widgets.CheckboxWidget;
import javango.forms.widgets.SelectMultipleWidget;
import javango.forms.widgets.SelectWidget;
import javango.forms.widgets.Widget;
import javango.forms.widgets.WidgetFactory;
import junit.framework.TestCase;
public class SelectWidgetTest extends InjectedTestCaseBase {
private Log log = LogFactory.getLog(SelectWidgetTest.class);
public void testBaseHtml() {
Map<String, String> choices = new LinkedHashMap<String, String>();
choices.put("1", "One");
choices.put("2", "Two");
Widget w = new SelectWidget<String, String>().setChoices(choices);
// ChoiceField field = (ChoiceField) new SelectField(injector.getInstance(WidgetFactory.class)).setChoices(choices).setAllowNull(false);
// w.setField(field);
String value = "2";
String output = w.render("field", value, new HashMap<String, Object>());
String html = "<select name=\"field\"><option value=\"1\" >One</option><option value=\"2\" selected=\"selected\">Two</option></select>";
assertEquals(html, output);
}
public void testNullValue() {
Map<String, String> choices = new LinkedHashMap<String, String>();
choices.put("1", "One");
choices.put("2", "Two");
Widget w = new SelectWidget<String, String>().setChoices(choices);
// ChoiceField field = (ChoiceField) new SelectField(injector.getInstance(WidgetFactory.class)).setChoices(choices).setAllowNull(false);
// w.setField(field);
String value = null;
String output = w.render("field", value, new HashMap<String, Object>());
String html = "<select name=\"field\"><option value=\"1\" >One</option><option value=\"2\" >Two</option></select>";
assertEquals(html, output);
}
public void testValueFromMap() throws Exception {
Map<String, String[]> postData = new LinkedHashMap<String, String[]>();
postData.put("pickme", new String[] {"2"});
Map<String, String> choices = new LinkedHashMap<String, String>();
choices.put("1", "One");
choices.put("2", "Two");
SelectWidget w = new SelectWidget();
ChoiceField field = (ChoiceField) new SelectField(injector.getInstance(WidgetFactory.class)).setChoices(choices).setAllowNull(false).setName("pickme");
// w.setField(field);
String[] o = w.valueFromMap(postData, "pickme");
assertEquals("2", o[0]);
Map<String, String> errors = new HashMap<String, String>();
Object cleaned = field.clean(o, errors);
assertTrue(errors.isEmpty());
assertEquals("2", cleaned);
}
public static class TestForm extends AbstractForm {
@FieldProperties(widgetClass=CheckboxWidget.class)
@ChoiceFieldProperties(choices = {@Choice(key="Y", value="Yes")})
public SelectField pickme;
@ChoiceFieldProperties(choices = {@Choice(key="Y", value="Yes"),@Choice(key="N", value="No")})
public SelectField selectme;
@Inject
public TestForm(FieldFactory fieldFactory) {
super(fieldFactory);
// TODO Auto-generated constructor stub
}
}
public void testCheckboxWidget() throws Exception {
// Map<String, Object> choices = new LinkedHashMap<String, Object>();
// choices.put("1", "One");
//// TODO should this allow multiple values, or is that an exception... how does selctfield handle multiple,, force multiplselectwidget?
// Form form = injector.getInstance(TestForm.class);
//
// // TODO This expected may not be 100% correct.
// String expected = "<tr><th>pickme</th><td><input id=\"id_pickme\" type=\"checkbox\" name=\"pickme\" value==\"Y\"> Yes\n</td></tr>\n";
//
// assertEquals(expected, form.asTable());
}
public void testNotEditable() throws Exception {
Form form = injector.getInstance(TestForm.class);
form.getFields().get("pickme").setEditable(false);
form.getFields().get("selectme").setEditable(false);
String expected =
"<tr><th><label for='id_pickme'>Pickme</label></th><td><input id=\"id_pickme\" type=\"checkbox\" name=\"pickme\" disabled=\"disabled\" /></td></tr>\n" +
"<tr><th><label for='id_selectme'>Selectme</label></th><td><select id=\"id_selectme\" name=\"selectme\" disabled=\"disabled\"><option value=\"\" >--</option><option value=\"Y\" >Yes</option><option value=\"N\" >No</option></select></td></tr>\n";
assertEquals(expected, form.asTable());
}
}