You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by ng...@apache.org on 2011/01/14 13:24:28 UTC

svn commit: r1058981 - in /mina/vysper/trunk/server/admin-console/src: main/java/org/apache/vysper/console/ test/java/org/apache/vysper/console/

Author: ngn
Date: Fri Jan 14 12:24:28 2011
New Revision: 1058981

URL: http://svn.apache.org/viewvc?rev=1058981&view=rev
Log:
Adding support for the remaining field types

Added:
    mina/vysper/trunk/server/admin-console/src/test/java/org/apache/vysper/console/AdHocCommandDataBuilderTest.java
    mina/vysper/trunk/server/admin-console/src/test/java/org/apache/vysper/console/HtmlFormBuilderTest.java
Modified:
    mina/vysper/trunk/server/admin-console/src/main/java/org/apache/vysper/console/AdHocCommandDataBuilder.java
    mina/vysper/trunk/server/admin-console/src/main/java/org/apache/vysper/console/HtmlFormBuilder.java
    mina/vysper/trunk/server/admin-console/src/test/java/org/apache/vysper/console/AdminConsoleControllerTest.java

Modified: mina/vysper/trunk/server/admin-console/src/main/java/org/apache/vysper/console/AdHocCommandDataBuilder.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/admin-console/src/main/java/org/apache/vysper/console/AdHocCommandDataBuilder.java?rev=1058981&r1=1058980&r2=1058981&view=diff
==============================================================================
--- mina/vysper/trunk/server/admin-console/src/main/java/org/apache/vysper/console/AdHocCommandDataBuilder.java (original)
+++ mina/vysper/trunk/server/admin-console/src/main/java/org/apache/vysper/console/AdHocCommandDataBuilder.java Fri Jan 14 12:24:28 2011
@@ -38,7 +38,10 @@ public class AdHocCommandDataBuilder {
             if(!AdminConsoleController.SESSION_FIELD.equals(entry.getKey())) {
                 FormField field = new FormField(entry.getKey());
                 for(String value : entry.getValue()) {
-                    field.addValue(value);
+                    String[] splitValues = value.split("[\\r\\n]+");
+                    for(String splitValue : splitValues) {
+                        field.addValue(splitValue);
+                    }
                 }
                 form.addField(field);
             }

Modified: mina/vysper/trunk/server/admin-console/src/main/java/org/apache/vysper/console/HtmlFormBuilder.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/admin-console/src/main/java/org/apache/vysper/console/HtmlFormBuilder.java?rev=1058981&r1=1058980&r2=1058981&view=diff
==============================================================================
--- mina/vysper/trunk/server/admin-console/src/main/java/org/apache/vysper/console/HtmlFormBuilder.java (original)
+++ mina/vysper/trunk/server/admin-console/src/main/java/org/apache/vysper/console/HtmlFormBuilder.java Fri Jan 14 12:24:28 2011
@@ -19,86 +19,244 @@
  */
 package org.apache.vysper.console;
 
+import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 
 import org.jivesoftware.smackx.FormField;
+import org.jivesoftware.smackx.FormField.Option;
 import org.jivesoftware.smackx.packet.DataForm;
 
 public class HtmlFormBuilder {
 
     public String build(DataForm form) {
-        if(form == null) return "";
-        
-        StringBuffer sb = new StringBuffer();
+        if (form == null)
+            return "";
+
+        StringBuilder sb = new StringBuilder();
         Iterator<String> instructions = form.getInstructions();
-        while(instructions.hasNext()) {
+        while (instructions.hasNext()) {
             sb.append("<p class='instruction'>" + instructions.next() + "</p>");
         }
-        
+
         Iterator<FormField> fields = form.getFields();
-        while(fields.hasNext()) {
+        while (fields.hasNext()) {
             FormField field = fields.next();
             String type = field.getType();
             sb.append("<p>");
-            if("hidden".equals(type)) {
+            if ("hidden".equals(type)) {
                 sb.append(hiddenFieldToHtml(field));
-            } else if("fixed".equals(type)) {
+            } else if ("fixed".equals(type)) {
                 sb.append(fixedFieldToHtml(field));
-            } else if("jid-single".equals(type)) {
+            } else if ("jid-single".equals(type)) {
                 sb.append(jidSingleFieldToHtml(field));
-            } else if("text-single".equals(type)) {
+            } else if ("text-single".equals(type) || type == null) {
                 sb.append(textSingleFieldToHtml(field));
-            } else if("text-private".equals(type)) {
+            } else if ("text-private".equals(type)) {
                 sb.append(textPrivateFieldToHtml(field));
+            } else if ("text-multi".equals(type)) {
+                sb.append(textMultiFieldToHtml(field));
+            } else if ("list-single".equals(type)) {
+                sb.append(listSingleFieldToHtml(field));
+            } else if ("list-multi".equals(type)) {
+                sb.append(listMultiFieldToHtml(field));
+            } else if ("jid-multi".equals(type)) {
+                // for now, do jid-multi as a textarea
+                sb.append(textMultiFieldToHtml(field));
+            } else if ("boolean".equals(type)) {
+                sb.append(booleanFieldToHtml(field));
             } else {
-                System.out.println("Unknown field type: " + type);
+                throw new RuntimeException("Unknown field type: " + type);
             }
+            sb.append(descToHtml(field));
             sb.append("</p>");
         }
-        
+
         return sb.toString();
     }
-    
+
     private String labelToHtml(FormField field) {
-        StringBuffer sb = new StringBuffer();
-        if(field.getLabel() != null) {
-            sb.append("<label>");
-            // TODO for
+        StringBuilder sb = new StringBuilder();
+        if (field.getLabel() != null) {
+            sb.append("<label for='");
+            sb.append(varToId(field.getVariable()));
+            sb.append("'>");
             sb.append(field.getLabel());
             sb.append("</label>");
         }
         return sb.toString();
     }
-    
-    private String hiddenFieldToHtml(FormField field) {
-        return labelToHtml(field) + "<input type='hidden' name='" + field.getVariable() + "' value='" + getSingleValue(field) + "' />"; 
-    }
 
+    private String descToHtml(FormField field) {
+        StringBuilder sb = new StringBuilder();
+        if (field.getDescription() != null) {
+            sb.append("<img src='resources/info.png' title='");
+            sb.append(field.getDescription());
+            sb.append("' />");
+        }
+        return sb.toString();
+    }
+    
     private String fixedFieldToHtml(FormField field) {
-        StringBuffer sb = new StringBuffer();
-        if(field.getLabel() != null) sb.append(field.getLabel());
+        StringBuilder sb = new StringBuilder();
+        if (field.getLabel() != null)
+            sb.append(field.getLabel());
         sb.append(" <span>" + field.getValues().next() + "</span>");
         return sb.toString();
     }
 
-    private String jidSingleFieldToHtml(FormField field) {
-        return labelToHtml(field) + "<input name='" + field.getVariable() + "' value='" + getSingleValue(field) + "' type='email' placeholder='example@vysper.org' />";
+    private String hiddenFieldToHtml(FormField field) {
+        return singleValueFieldToHtml(field, "hidden", null);
     }
     
+    private String jidSingleFieldToHtml(FormField field) {
+        return singleValueFieldToHtml(field, "email", "example@vysper.org");
+    }
+
     private String textSingleFieldToHtml(FormField field) {
-        return labelToHtml(field) + "<input name='" + field.getVariable() + "' value='" + getSingleValue(field) + "' />";
+        return singleValueFieldToHtml(field, null, null);
     }
 
     private String textPrivateFieldToHtml(FormField field) {
-        return labelToHtml(field) + "<input name='" + field.getVariable() + "' type='password' value='" + getSingleValue(field) + "' />";
+        return singleValueFieldToHtml(field, "password", null);
+    }
+    
+    private String textMultiFieldToHtml(FormField field) {
+        StringBuilder sb = new StringBuilder();
+        sb.append(labelToHtml(field));
+        sb.append("<textarea id='");
+        sb.append(varToId(field.getVariable()));
+        sb.append("' name='");
+        sb.append(field.getVariable());
+        sb.append("'>");
+        
+        boolean first = true;
+        Iterator<String> values = field.getValues();
+        while(values.hasNext()) {
+            if(!first) sb.append("\r\n");
+            sb.append(values.next());
+            first = false;
+        }
+        
+        sb.append("</textarea>");
+        return sb.toString();
+    }
+    
+    private String listSingleFieldToHtml(FormField field) {
+        Iterator<String> fieldValues = field.getValues();
+        List<String> values = new ArrayList<String>();
+        if(fieldValues.hasNext()) values.add(fieldValues.next());
+        
+        return listFieldToHtml(field, values, false);
+    }
+
+    private String listMultiFieldToHtml(FormField field) {
+        Iterator<String> fieldValues = field.getValues();
+        List<String> values = new ArrayList<String>();
+        while(fieldValues.hasNext()) {
+            values.add(fieldValues.next());
+        }
+        
+        return listFieldToHtml(field, values, true);
     }
+
+    private String listFieldToHtml(FormField field, List<String> values, boolean multiple) {
+        StringBuilder sb = new StringBuilder();
+        sb.append(labelToHtml(field));
+        sb.append("<select id='");
+        sb.append(varToId(field.getVariable()));
+        sb.append("' name='");
+        sb.append(field.getVariable());
+        sb.append("'");
+        if(multiple) {
+            sb.append(" multiple");
+        }
+        sb.append(">");
+        
+        Iterator<Option> options = field.getOptions();
+        
+        while(options.hasNext()) {
+            Option option = options.next();
+            sb.append("<option value='");
+            sb.append(option.getValue());
+            sb.append("'");
+            
+            if(values.contains(option.getValue())) {
+                sb.append(" selected");
+            }
+            sb.append(">");
+            if(option.getLabel() != null) {
+                sb.append(option.getLabel());
+            } else {
+                sb.append(option.getValue());
+            }
+        
+            sb.append("</option>");
+        }
+        
+        
+        
+        sb.append("</select>");
+        return sb.toString();
+    }
+
+
     
+    private String booleanFieldToHtml(FormField field) {
+        StringBuilder sb = new StringBuilder();
+        boolean value = (field.getValues().hasNext() && "true".equals(field.getValues().next()));
+        
+        sb.append(labelToHtml(field));
+        sb.append("<input name='");
+        sb.append(field.getVariable());
+        sb.append("' value='true' type='radio' ");
+        if(value) sb.append("selected ");
+        sb.append("/> Yes ");
+        sb.append("<input name='");
+        sb.append(field.getVariable());
+        sb.append("' value='false' type='radio' ");
+        if(!value) sb.append("selected ");
+        sb.append("/> No");
+
+        
+        return sb.toString();
+    }
+
+    private String singleValueFieldToHtml(FormField field, String type, String placeholder) {
+        StringBuilder sb = new StringBuilder();
+        sb.append(labelToHtml(field));
+        sb.append("<input id='");
+        sb.append(varToId(field.getVariable()));
+        sb.append("' name='");
+        sb.append(field.getVariable());
+        sb.append("' value='");
+        sb.append(getSingleValue(field));
+        sb.append("'");
+        if(type != null) {
+            sb.append(" type='" + type + "'");
+        }
+        if(placeholder != null) {
+            sb.append(" placeholder='" + placeholder + "'");
+        }
+        sb.append(required(field));
+        sb.append(" />");
+        return sb.toString();
+    }
+
+    private String required(FormField field) {
+        return field.isRequired() ? "required" : "";
+    }
+
     private String getSingleValue(FormField field) {
-        if(field.getValues().hasNext()) {
+        if (field.getValues().hasNext()) {
             return field.getValues().next();
         } else {
             return "";
         }
     }
+    
+    private String varToId(String var) {
+        return var.replaceAll("[^A-Za-z0-9]", "-");
+    }
 
 }

Added: mina/vysper/trunk/server/admin-console/src/test/java/org/apache/vysper/console/AdHocCommandDataBuilderTest.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/admin-console/src/test/java/org/apache/vysper/console/AdHocCommandDataBuilderTest.java?rev=1058981&view=auto
==============================================================================
--- mina/vysper/trunk/server/admin-console/src/test/java/org/apache/vysper/console/AdHocCommandDataBuilderTest.java (added)
+++ mina/vysper/trunk/server/admin-console/src/test/java/org/apache/vysper/console/AdHocCommandDataBuilderTest.java Fri Jan 14 12:24:28 2011
@@ -0,0 +1,69 @@
+/*
+ *  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.vysper.console;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.jivesoftware.smackx.FormField;
+import org.jivesoftware.smackx.packet.AdHocCommandData;
+import org.jivesoftware.smackx.packet.DataForm;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+public class AdHocCommandDataBuilderTest {
+
+    @Test
+    public void multiRowValueWithCRLFMustGeneratedMultipleValues() {
+        multiRowValueMustGeneratedMultipleValues(new String[]{"value 1\r\nvalue 2"});
+    }
+
+    @Test
+    public void multiRowValueWithCRMustGeneratedMultipleValues() {
+        multiRowValueMustGeneratedMultipleValues(new String[]{"value 1\rvalue 2"});
+    }
+    
+    @Test
+    public void multiRowValueWithLFMustGeneratedMultipleValues() {
+        multiRowValueMustGeneratedMultipleValues(new String[]{"value 1\nvalue 2"});
+    }
+    
+    private void multiRowValueMustGeneratedMultipleValues(String[] value) {
+        Map<String, String[]> parameters = new HashMap<String, String[]>();
+        
+        parameters.put(AdminConsoleController.SESSION_FIELD, new String[]{"sessionid"});
+        parameters.put("test", value);
+        
+        AdHocCommandDataBuilder builder = new AdHocCommandDataBuilder();
+        AdHocCommandData commandData = builder.build(parameters);
+        
+        DataForm form = commandData.getForm();
+        Assert.assertTrue(form.getFields().hasNext());
+        FormField field = form.getFields().next();
+        
+        Iterator<String> values = field.getValues();
+        Assert.assertEquals("value 1", values.next());
+        Assert.assertEquals("value 2", values.next());
+        Assert.assertFalse(values.hasNext());
+    }
+
+}

Modified: mina/vysper/trunk/server/admin-console/src/test/java/org/apache/vysper/console/AdminConsoleControllerTest.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/admin-console/src/test/java/org/apache/vysper/console/AdminConsoleControllerTest.java?rev=1058981&r1=1058980&r2=1058981&view=diff
==============================================================================
--- mina/vysper/trunk/server/admin-console/src/test/java/org/apache/vysper/console/AdminConsoleControllerTest.java (original)
+++ mina/vysper/trunk/server/admin-console/src/test/java/org/apache/vysper/console/AdminConsoleControllerTest.java Fri Jan 14 12:24:28 2011
@@ -66,8 +66,9 @@ public class AdminConsoleControllerTest 
         Mockito.verify(connection).login(ENTITY, PASSWORD);
         
         Assert.assertNull(session.getAttribute(AdminConsoleController.SESSION_ATTRIBUTE));
-        Assert.assertEquals("login", mav.getViewName());
+        Assert.assertEquals("index", mav.getViewName());
         Assert.assertNotNull(mav.getModel().get("error"));
+        Assert.assertNull(mav.getModel().get("authenticated"));
     }
 
     @Test
@@ -79,29 +80,33 @@ public class AdminConsoleControllerTest 
         Mockito.verify(connection).connect();
         
         Assert.assertNull(session.getAttribute(AdminConsoleController.SESSION_ATTRIBUTE));
-        Assert.assertEquals("login", mav.getViewName());
+        Assert.assertEquals("index", mav.getViewName());
         Assert.assertNotNull(mav.getModel().get("error"));
+        Assert.assertNull(mav.getModel().get("authenticated"));
     }
 
     @Test
     public void indexNotAuthenticated() throws XMPPException {
         ModelAndView mav = controller.index(session);
         
-        Assert.assertEquals("login", mav.getViewName());
+        Assert.assertEquals("index", mav.getViewName());
+        Assert.assertNull(mav.getModel().get("authenticated"));
     }
 
     @Test
     public void commandNotAuthenticated() throws XMPPException {
         ModelAndView mav = controller.command("foo", session);
         
-        Assert.assertEquals("login", mav.getViewName());
+        Assert.assertEquals("index", mav.getViewName());
+        Assert.assertNull(mav.getModel().get("authenticated"));
     }
 
     @Test
     public void submitCommandNotAuthenticated() throws XMPPException {
         ModelAndView mav = controller.submitCommand("foo", request, session);
         
-        Assert.assertEquals("login", mav.getViewName());
+        Assert.assertEquals("index", mav.getViewName());
+        Assert.assertNull(mav.getModel().get("authenticated"));
     }
 
 }

Added: mina/vysper/trunk/server/admin-console/src/test/java/org/apache/vysper/console/HtmlFormBuilderTest.java
URL: http://svn.apache.org/viewvc/mina/vysper/trunk/server/admin-console/src/test/java/org/apache/vysper/console/HtmlFormBuilderTest.java?rev=1058981&view=auto
==============================================================================
--- mina/vysper/trunk/server/admin-console/src/test/java/org/apache/vysper/console/HtmlFormBuilderTest.java (added)
+++ mina/vysper/trunk/server/admin-console/src/test/java/org/apache/vysper/console/HtmlFormBuilderTest.java Fri Jan 14 12:24:28 2011
@@ -0,0 +1,265 @@
+/*
+ *  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.vysper.console;
+
+import org.jivesoftware.smackx.FormField;
+import org.jivesoftware.smackx.FormField.Option;
+import org.jivesoftware.smackx.packet.DataForm;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+public class HtmlFormBuilderTest {
+    
+    private static final String LABEL = "Some label";
+    private static final String VALUE1 = "Value 1";
+    private static final String VALUE2 = "Value 2";
+    private static final String VALUE3 = "Value 3";
+
+    private DataForm form = new DataForm("form");
+    private HtmlFormBuilder builder = new HtmlFormBuilder();
+
+    @Test
+    public void testHiddenField() {
+        FormField field = new FormField("abc def");
+        field.setType("hidden");
+        field.addValue(VALUE1);
+        form.addField(field);
+        
+        String actual = builder.build(form);
+        String expected = "<p><input id='abc-def' name='abc def' value='Value 1' type='hidden' /></p>";
+        
+        Assert.assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testTextPrivateField() {
+        FormField field = new FormField("abc def");
+        field.setType("text-private");
+        field.addValue(VALUE1);
+        form.addField(field);
+        
+        String actual = builder.build(form);
+        String expected = "<p><input id='abc-def' name='abc def' value='Value 1' type='password' /></p>";
+        
+        Assert.assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testTextSingleField() {
+        FormField field = new FormField("abc def");
+        field.setType("text-single");
+        field.addValue(VALUE1);
+        form.addField(field);
+        
+        String actual = builder.build(form);
+        String expected = "<p><input id='abc-def' name='abc def' value='Value 1' /></p>";
+        
+        Assert.assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testFixedField() {
+        FormField field = new FormField("abc def");
+        field.setType("fixed");
+        field.addValue(VALUE1);
+        field.setLabel(LABEL);
+        form.addField(field);
+        
+        String actual = builder.build(form);
+        String expected = "<p>Some label <span>Value 1</span></p>";
+        
+        Assert.assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testJidSingleField() {
+        FormField field = new FormField("abc def");
+        field.setType("jid-single");
+        field.addValue(VALUE1);
+        form.addField(field);
+        
+        String actual = builder.build(form);
+        String expected = "<p><input id='abc-def' name='abc def' value='Value 1' type='email' placeholder='example@vysper.org' /></p>";
+        
+        Assert.assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testTextMultiField() {
+        FormField field = new FormField("abc def");
+        field.setType("text-multi");
+        field.addValue(VALUE1);
+        field.addValue(VALUE2);
+        field.addValue(VALUE3);
+        form.addField(field);
+        
+        String actual = builder.build(form);
+        String expected = "<p><textarea id='abc-def' name='abc def'>" + VALUE1 + "\r\n" + VALUE2 + "\r\n" + VALUE3 + "</textarea></p>";
+        
+        Assert.assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testJidMultiField() {
+        FormField field = new FormField("abc def");
+        field.setType("jid-multi");
+        field.addValue(VALUE1);
+        field.addValue(VALUE2);
+        field.addValue(VALUE3);
+        form.addField(field);
+        
+        String actual = builder.build(form);
+        String expected = "<p><textarea id='abc-def' name='abc def'>" + VALUE1 + "\r\n" + VALUE2 + "\r\n" + VALUE3 + "</textarea></p>";
+        
+        Assert.assertEquals(expected, actual);
+    }
+
+    @Test
+    public void listSingleFieldNoValue() {
+        FormField field = new FormField("abc def");
+        field.setType("list-single");
+        field.addOption(new Option("Label 1", VALUE1));
+        field.addOption(new Option(VALUE2));
+        form.addField(field);
+        
+        String actual = builder.build(form);
+        String expected = "<p><select id='abc-def' name='abc def'><option value='" + VALUE1 + "'>Label 1</option><option value='" + VALUE2 + "'>" + VALUE2 + "</option></select></p>";
+        
+        Assert.assertEquals(expected, actual);
+    }
+    
+    @Test
+    public void listSingleFieldWithValue() {
+        FormField field = new FormField("abc def");
+        field.setType("list-single");
+        field.addOption(new Option("Label 1", VALUE1));
+        field.addOption(new Option(VALUE2));
+        field.addValue(VALUE1);
+        form.addField(field);
+        
+        String actual = builder.build(form);
+        String expected = "<p><select id='abc-def' name='abc def'><option value='" + VALUE1 + "' selected>Label 1</option><option value='" + VALUE2 + "'>" + VALUE2 + "</option></select></p>";
+        
+        Assert.assertEquals(expected, actual);
+    }
+
+    @Test
+    public void listMultiFieldNoValue() {
+        FormField field = new FormField("abc def");
+        field.setType("list-multi");
+        field.addOption(new Option("Label 1", VALUE1));
+        field.addOption(new Option(VALUE2));
+        form.addField(field);
+        
+        String actual = builder.build(form);
+        String expected = "<p><select id='abc-def' name='abc def' multiple><option value='" + VALUE1 + "'>Label 1</option><option value='" + VALUE2 + "'>" + VALUE2 + "</option></select></p>";
+        
+        Assert.assertEquals(expected, actual);
+    }
+    
+    @Test
+    public void listMultiFieldWithValue() {
+        FormField field = new FormField("abc def");
+        field.setType("list-multi");
+        field.addOption(new Option("Label 1", VALUE1));
+        field.addOption(new Option(VALUE2));
+        field.addOption(new Option(VALUE3));
+        field.addValue(VALUE1);
+        field.addValue(VALUE3);
+        form.addField(field);
+        
+        String actual = builder.build(form);
+        String expected = "<p><select id='abc-def' name='abc def' multiple>" +
+        		"<option value='" + VALUE1 + "' selected>Label 1</option>" +
+        		"<option value='" + VALUE2 + "'>" + VALUE2 + "</option>" +
+        		"<option value='" + VALUE3 + "' selected>" + VALUE3 + "</option>" +
+        		"</select></p>";
+        
+        Assert.assertEquals(expected, actual);
+    }
+    
+    
+    @Test
+    public void testBooleanFieldDefault() {
+        FormField field = new FormField("abc def");
+        field.setType("boolean");
+        form.addField(field);
+        
+        String actual = builder.build(form);
+        String expected = "<p><input name='abc def' value='true' type='radio' /> Yes <input name='abc def' value='false' type='radio' selected /> No</p>"; 
+        
+        Assert.assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testBooleanFieldWithValue() {
+        FormField field = new FormField("abc def");
+        field.setType("boolean");
+        field.addValue("true");
+        form.addField(field);
+        
+        String actual = builder.build(form);
+        String expected = "<p><input name='abc def' value='true' type='radio' selected /> Yes <input name='abc def' value='false' type='radio' /> No</p>"; 
+        
+        Assert.assertEquals(expected, actual);
+    }
+
+    
+    @Test
+    public void testNoTypeField() {
+        FormField field = new FormField("abc def");
+        field.addValue(VALUE1);
+        form.addField(field);
+        
+        String actual = builder.build(form);
+        String expected = "<p><input id='abc-def' name='abc def' value='Value 1' /></p>";
+        
+        Assert.assertEquals(expected, actual);
+    }
+
+    
+    @Test
+    public void testLabel() {
+        FormField field = new FormField("abc def");
+        field.setLabel(LABEL);
+        field.addValue(VALUE1);
+        form.addField(field);
+        
+        String actual = builder.build(form);
+        String expected = "<p><label for='abc-def'>" + LABEL + "</label><input id='abc-def' name='abc def' value='Value 1' /></p>";
+        
+        Assert.assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testDesc() {
+        FormField field = new FormField("abc def");
+        field.setDescription("Some description");
+        field.addValue(VALUE1);
+        form.addField(field);
+        
+        String actual = builder.build(form);
+        String expected = "<p><input id='abc-def' name='abc def' value='Value 1' /><img src='resources/info.png' title='Some description' /></p>";
+        
+        Assert.assertEquals(expected, actual);
+    }
+
+}