1
0
Fork 0
mirror of https://github.com/vanitasvitae/Smack.git synced 2025-12-09 20:41:07 +01:00

Introduce FormFieldChildElement and make FormField immutable

This commit is contained in:
Florian Schmaus 2019-06-10 16:58:38 +02:00
parent 1a99801501
commit 4d36e3b521
36 changed files with 1191 additions and 490 deletions

View file

@ -117,31 +117,31 @@ public class EntityCapsManagerTest extends InitExtensions {
DataForm df = new DataForm(DataForm.Type.result);
FormField ff = new FormField("os");
FormField.Builder ff = FormField.builder("os");
ff.addValue("Mac");
df.addField(ff);
df.addField(ff.build());
ff = new FormField("FORM_TYPE");
ff = FormField.builder("FORM_TYPE");
ff.setType(FormField.Type.hidden);
ff.addValue("urn:xmpp:dataforms:softwareinfo");
df.addField(ff);
df.addField(ff.build());
ff = new FormField("ip_version");
ff = FormField.builder("ip_version");
ff.addValue("ipv4");
ff.addValue("ipv6");
df.addField(ff);
df.addField(ff.build());
ff = new FormField("os_version");
ff = FormField.builder("os_version");
ff.addValue("10.5.1");
df.addField(ff);
df.addField(ff.build());
ff = new FormField("software");
ff = FormField.builder("software");
ff.addValue("Psi");
df.addField(ff);
df.addField(ff.build());
ff = new FormField("software_version");
ff = FormField.builder("software_version");
ff.addValue("0.11");
df.addField(ff);
df.addField(ff.build());
di.addExtension(df);
return di;
@ -174,31 +174,31 @@ public class EntityCapsManagerTest extends InitExtensions {
DataForm df = new DataForm(DataForm.Type.result);
FormField ff = new FormField("os");
FormField.Builder ff = FormField.builder("os");
ff.addValue("Mac");
df.addField(ff);
df.addField(ff.build());
ff = new FormField("FORM_TYPE");
ff = FormField.builder("FORM_TYPE");
ff.setType(FormField.Type.hidden);
ff.addValue("urn:xmpp:dataforms:softwareinfo");
df.addField(ff);
df.addField(ff.build());
ff = new FormField("ip_version");
ff = FormField.builder("ip_version");
ff.addValue("ipv4");
ff.addValue("ipv6");
df.addField(ff);
df.addField(ff.build());
ff = new FormField("os_version");
ff = FormField.builder("os_version");
ff.addValue("10.5.1");
df.addField(ff);
df.addField(ff.build());
ff = new FormField("software");
ff = FormField.builder("software");
ff.addValue("Psi");
df.addField(ff);
df.addField(ff.build());
ff = new FormField("software_version");
ff = FormField.builder("software_version");
ff.addValue("0.11");
df.addField(ff);
df.addField(ff.build());
di.addExtension(df);
@ -206,14 +206,14 @@ public class EntityCapsManagerTest extends InitExtensions {
// FORM_TYPE
df = new DataForm(DataForm.Type.result);
ff = new FormField("FORM_TYPE");
ff = FormField.builder("FORM_TYPE");
ff.setType(FormField.Type.hidden);
ff.addValue("urn:xmpp:dataforms:softwareinfo");
df.addField(ff);
df.addField(ff.build());
ff = new FormField("software");
ff = FormField.builder("software");
ff.addValue("smack");
df.addField(ff);
df.addField(ff.build());
di.addExtension(df);

View file

@ -42,17 +42,17 @@ public class RoomInfoTest {
public void validateRoomWithForm() {
DataForm dataForm = new DataForm(DataForm.Type.result);
FormField desc = new FormField("muc#roominfo_description");
FormField.Builder desc = FormField.builder("muc#roominfo_description");
desc.addValue("The place for all good witches!");
dataForm.addField(desc);
dataForm.addField(desc.build());
FormField subject = new FormField("muc#roominfo_subject");
FormField.Builder subject = FormField.builder("muc#roominfo_subject");
subject.addValue("Spells");
dataForm.addField(subject);
dataForm.addField(subject.build());
FormField occupants = new FormField("muc#roominfo_occupants");
FormField.Builder occupants = FormField.builder("muc#roominfo_occupants");
occupants.addValue("3");
dataForm.addField(occupants);
dataForm.addField(occupants.build());
DiscoverInfo discoInfo = new DiscoverInfo();
discoInfo.addExtension(dataForm);

View file

@ -20,6 +20,7 @@ import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import org.jivesoftware.smack.packet.Element;
import org.jivesoftware.smack.test.util.SmackTestSuite;
import org.jivesoftware.smack.util.PacketParserUtils;
import org.jivesoftware.smack.xml.XmlPullParser;
@ -41,9 +42,9 @@ import org.junit.Test;
* @author Anno van Vliet
*
*/
public class DataFormTest {
private static final String TEST_OUTPUT_1 = "<x xmlns='jabber:x:data' type='submit'><instructions>InstructionTest1</instructions><field var='testField1'></field></x>";
private static final String TEST_OUTPUT_2 = "<x xmlns='jabber:x:data' type='submit'><instructions>InstructionTest1</instructions><field var='testField1'></field><page xmlns='http://jabber.org/protocol/xdata-layout' label='Label'><fieldref var='testField1'/><section label='section Label'><text>SectionText</text></section><text>PageText</text></page></x>";
public class DataFormTest extends SmackTestSuite {
private static final String TEST_OUTPUT_1 = "<x xmlns='jabber:x:data' type='submit'><instructions>InstructionTest1</instructions><field var='testField1'/></x>";
private static final String TEST_OUTPUT_2 = "<x xmlns='jabber:x:data' type='submit'><instructions>InstructionTest1</instructions><field var='testField1'/><page xmlns='http://jabber.org/protocol/xdata-layout' label='Label'><fieldref var='testField1'/><section label='section Label'><text>SectionText</text></section><text>PageText</text></page></x>";
private static final String TEST_OUTPUT_3 = "<x xmlns='jabber:x:data' type='submit'><instructions>InstructionTest1</instructions><field var='testField1'><validate xmlns='http://jabber.org/protocol/xdata-validate' datatype='xs:integer'><range min='1111' max='9999'/></validate></field></x>";
private static final DataFormProvider pr = new DataFormProvider();
@ -54,7 +55,7 @@ public class DataFormTest {
DataForm df = new DataForm(DataForm.Type.submit);
String instruction = "InstructionTest1";
df.addInstruction(instruction);
FormField field = new FormField("testField1");
FormField field = FormField.builder("testField1").build();
df.addField(field);
assertNotNull(df.toXML());
@ -81,7 +82,7 @@ public class DataFormTest {
DataForm df = new DataForm(DataForm.Type.submit);
String instruction = "InstructionTest1";
df.addInstruction(instruction);
FormField field = new FormField("testField1");
FormField field = FormField.builder("testField1").build();
df.addField(field);
DataLayout layout = new DataLayout("Label");
@ -123,11 +124,12 @@ public class DataFormTest {
DataForm df = new DataForm(DataForm.Type.submit);
String instruction = "InstructionTest1";
df.addInstruction(instruction);
FormField field = new FormField("testField1");
df.addField(field);
FormField.Builder fieldBuilder = FormField.builder("testField1");
ValidateElement dv = new RangeValidateElement("xs:integer", "1111", "9999");
field.setValidateElement(dv);
fieldBuilder.addFormFieldChildElement(dv);
df.addField(fieldBuilder.build());
assertNotNull(df.toXML());
String output = df.toXML().toString();
@ -140,7 +142,7 @@ public class DataFormTest {
assertNotNull(df);
assertNotNull(df.getFields());
assertEquals(1 , df.getFields().size());
Element element = df.getFields().get(0).getValidateElement();
Element element = ValidateElement.from(df.getFields().get(0));
assertNotNull(element);
dv = (ValidateElement) element;

View file

@ -17,7 +17,7 @@
package org.jivesoftware.smackx.xdatavalidation;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.junit.jupiter.api.Assertions.assertThrows;
import org.jivesoftware.smackx.xdata.FormField;
import org.jivesoftware.smackx.xdatavalidation.packet.ValidateElement.BasicValidateElement;
@ -26,7 +26,7 @@ import org.jivesoftware.smackx.xdatavalidation.packet.ValidateElement.OpenValida
import org.jivesoftware.smackx.xdatavalidation.packet.ValidateElement.RangeValidateElement;
import org.jivesoftware.smackx.xdatavalidation.packet.ValidateElement.RegexValidateElement;
import org.junit.Test;
import org.junit.jupiter.api.Test;
/**
* Data validation helper test.
@ -35,81 +35,55 @@ import org.junit.Test;
*/
public class DataValidationHelperTest {
@Test
public void testCheckConsistencyFormFieldBasicValidateElement() {
FormField field = new FormField("var");
field.setType(FormField.Type.jid_single);
FormField.Builder field = FormField.builder("var")
.setType(FormField.Type.jid_single);
BasicValidateElement element = new BasicValidateElement(null);
try {
element.checkConsistency(field);
fail("No correct check on consistency");
}
catch (ValidationConsistencyException e) {
assertEquals("Field type 'jid-single' is not consistent with validation method 'basic'.", e.getMessage());
}
ValidationConsistencyException vce = assertThrows(ValidationConsistencyException.class,
() -> element.checkConsistency(field));
assertEquals("Field type 'jid-single' is not consistent with validation method 'basic'.", vce.getMessage());
try {
new ListRange(-1L, 1L);
fail("No correct check on consistency");
}
catch (IllegalArgumentException e) {
assertEquals("unsigned 32-bit integers can't be negative", e.getMessage());
}
IllegalArgumentException iae = assertThrows(IllegalArgumentException.class,
() -> new ListRange(-1L, 1L));
assertEquals("unsigned 32-bit integers can't be negative", iae.getMessage());
element.setListRange(new ListRange(10L, 100L));
try {
element.checkConsistency(field);
fail("No correct check on consistency");
}
catch (ValidationConsistencyException e) {
assertEquals("Field type is not of type 'list-multi' while a 'list-range' is defined.", e.getMessage());
}
vce = assertThrows(ValidationConsistencyException.class, () -> element.checkConsistency(field));
assertEquals("Field type is not of type 'list-multi' while a 'list-range' is defined.", vce.getMessage());
field.setType(FormField.Type.list_multi);
element.checkConsistency(field);
FormField.Builder fieldListMulti = field.setType(FormField.Type.list_multi);
element.checkConsistency(fieldListMulti);
}
@Test
public void testCheckConsistencyFormFieldOpenValidateElement() {
FormField field = new FormField("var");
field.setType(FormField.Type.hidden);
FormField.Builder field = FormField.builder("var")
.setType(FormField.Type.hidden);
OpenValidateElement element = new OpenValidateElement(null);
try {
element.checkConsistency(field);
fail("No correct check on consistency");
}
catch (ValidationConsistencyException e) {
assertEquals("Field type 'hidden' is not consistent with validation method 'open'.", e.getMessage());
}
ValidationConsistencyException e = assertThrows(ValidationConsistencyException.class,
() -> element.checkConsistency(field));
assertEquals("Field type 'hidden' is not consistent with validation method 'open'.", e.getMessage());
}
@Test
public void testCheckConsistencyFormFieldRangeValidateElement() {
FormField field = new FormField("var");
field.setType(FormField.Type.text_multi);
FormField.Builder field = FormField.builder("var")
.setType(FormField.Type.text_multi);
RangeValidateElement element = new RangeValidateElement("xs:integer", null, "99");
try {
element.checkConsistency(field);
fail("No correct check on consistency");
}
catch (ValidationConsistencyException e) {
assertEquals("Field type 'text-multi' is not consistent with validation method 'range'.", e.getMessage());
}
ValidationConsistencyException e = assertThrows(ValidationConsistencyException.class,
() -> element.checkConsistency(field));
assertEquals("Field type 'text-multi' is not consistent with validation method 'range'.", e.getMessage());
}
@Test
public void testCheckConsistencyFormFieldRegexValidateElement() {
FormField field = new FormField("var");
field.setType(FormField.Type.list_multi);
FormField.Builder field = FormField.builder("var")
.setType(FormField.Type.list_multi);
RegexValidateElement element = new RegexValidateElement(null, ".*");
try {
element.checkConsistency(field);
fail("No correct check on consistency");
}
catch (ValidationConsistencyException e) {
assertEquals("Field type 'list-multi' is not consistent with validation method 'regex'.", e.getMessage());
}
ValidationConsistencyException e = assertThrows(ValidationConsistencyException.class,
() -> element.checkConsistency(field));
assertEquals("Field type 'list-multi' is not consistent with validation method 'regex'.", e.getMessage());
}
}

View file

@ -19,12 +19,13 @@ package org.jivesoftware.smackx.xdatavalidation.provider;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.jupiter.api.Assertions.assertThrows;
import java.io.IOException;
import org.jivesoftware.smack.parsing.SmackParsingException;
import org.jivesoftware.smack.test.util.SmackTestSuite;
import org.jivesoftware.smack.test.util.SmackTestUtil;
import org.jivesoftware.smack.test.util.TestUtils;
import org.jivesoftware.smack.xml.XmlPullParser;
import org.jivesoftware.smack.xml.XmlPullParserException;
import org.jivesoftware.smackx.xdata.FormField;
@ -35,7 +36,7 @@ import org.jivesoftware.smackx.xdatavalidation.packet.ValidateElement.BasicValid
import org.jivesoftware.smackx.xdatavalidation.packet.ValidateElement.ListRange;
import org.jivesoftware.smackx.xdatavalidation.packet.ValidateElement.RangeValidateElement;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource;
@ -44,7 +45,7 @@ import org.junit.jupiter.params.provider.EnumSource;
* @author Anno van Vliet
*
*/
public class DataValidationTest {
public class DataValidationTest extends SmackTestSuite {
private static final String TEST_INPUT_MIN = "<validate xmlns='http://jabber.org/protocol/xdata-validate'></validate>";
private static final String TEST_OUTPUT_MIN = "<validate xmlns='http://jabber.org/protocol/xdata-validate'><basic/></validate>";
private static final String TEST_OUTPUT_RANGE = "<validate xmlns='http://jabber.org/protocol/xdata-validate' datatype='xs:string'><range min='min-val' max='max-val'/><list-range min='111' max='999'/></validate>";
@ -52,42 +53,50 @@ public class DataValidationTest {
private static final String TEST_OUTPUT_FAIL = "<validate xmlns='http://jabber.org/protocol/xdata-validate'><list-range min='1-1-1' max='999'/></validate>";
@Test
public void testMin() throws XmlPullParserException, IOException {
public void testBasic() {
ValidateElement dv = new BasicValidateElement(null);
assertNotNull(dv.toXML());
String output = dv.toXML().toString();
assertEquals(TEST_OUTPUT_MIN, output);
}
XmlPullParser parser = getParser(TEST_INPUT_MIN);
dv = DataValidationProvider.parse(parser);
@ParameterizedTest
@EnumSource(SmackTestUtil.XmlPullParserKind.class)
public void testMin(SmackTestUtil.XmlPullParserKind parserKind) throws XmlPullParserException, IOException, SmackParsingException {
ValidateElement dv = SmackTestUtil.parse(TEST_INPUT_MIN, DataValidationProvider.class, parserKind);
assertNotNull(dv);
assertEquals("xs:string", dv.getDatatype());
assertTrue(dv instanceof BasicValidateElement);
assertNotNull(dv.toXML());
output = dv.toXML().toString();
String output = dv.toXML().toString();
assertEquals(TEST_OUTPUT_MIN, output);
}
@Test
public void testRange() throws XmlPullParserException, IOException {
public void testRangeToXml() {
ValidateElement dv = new RangeValidateElement("xs:string", "min-val", "max-val");
ListRange listRange = new ListRange(111L, 999L);
dv.setListRange(listRange);
assertNotNull(dv.toXML());
String output = dv.toXML().toString();
assertEquals(TEST_OUTPUT_RANGE, output);
}
XmlPullParser parser = getParser(output);
@ParameterizedTest
@EnumSource(SmackTestUtil.XmlPullParserKind.class)
public void testRange(SmackTestUtil.XmlPullParserKind parserKind)
throws XmlPullParserException, IOException, SmackParsingException {
ValidateElement dv = new RangeValidateElement("xs:string", "min-val", "max-val");
ListRange listRange = new ListRange(111L, 999L);
dv.setListRange(listRange);
dv = DataValidationProvider.parse(parser);
String xml = dv.toXML().toString();
dv = SmackTestUtil.parse(xml, DataValidationProvider.class, parserKind);
assertNotNull(dv);
assertEquals("xs:string", dv.getDatatype());
@ -99,24 +108,27 @@ public class DataValidationTest {
assertEquals(Long.valueOf(111), rdv.getListRange().getMin());
assertEquals(999, rdv.getListRange().getMax().intValue());
assertNotNull(dv.toXML());
output = dv.toXML().toString();
assertEquals(TEST_OUTPUT_RANGE, output);
xml = dv.toXML().toString();
assertEquals(TEST_OUTPUT_RANGE, xml);
}
@Test
public void testRange2() throws XmlPullParserException, IOException {
public void testRange2ToXml() {
ValidateElement dv = new RangeValidateElement(null, null, null);
assertNotNull(dv.toXML());
String output = dv.toXML().toString();
assertEquals(TEST_OUTPUT_RANGE2, output);
}
XmlPullParser parser = getParser(output);
@ParameterizedTest
@EnumSource(SmackTestUtil.XmlPullParserKind.class)
public void testRange2(SmackTestUtil.XmlPullParserKind parserKind) throws XmlPullParserException, IOException, SmackParsingException {
ValidateElement dv = new RangeValidateElement(null, null, null);
String xml = dv.toXML().toString();
dv = DataValidationProvider.parse(parser);
dv = SmackTestUtil.parse(xml, DataValidationProvider.class, parserKind);
assertNotNull(dv);
assertEquals("xs:string", dv.getDatatype());
@ -126,14 +138,15 @@ public class DataValidationTest {
assertEquals(null, rdv.getMax());
assertNotNull(rdv.toXML());
output = rdv.toXML().toString();
assertEquals(TEST_OUTPUT_RANGE2, output);
xml = rdv.toXML().toString();
assertEquals(TEST_OUTPUT_RANGE2, xml);
}
@Test(expected = NumberFormatException.class)
public void testRangeFailure() throws IOException, XmlPullParserException {
XmlPullParser parser = getParser(TEST_OUTPUT_FAIL);
DataValidationProvider.parse(parser);
@ParameterizedTest
@EnumSource(SmackTestUtil.XmlPullParserKind.class)
public void testRangeFailure(SmackTestUtil.XmlPullParserKind parserKind) throws IOException, XmlPullParserException {
assertThrows(NumberFormatException.class,
() -> SmackTestUtil.parse(TEST_OUTPUT_FAIL, DataValidationProvider.class, parserKind));
}
@ParameterizedTest
@ -168,18 +181,8 @@ public class DataValidationTest {
assertEquals("Event Name", nameField.getLabel());
FormField dataStartField = dataForm.getField("date/start");
ValidateElement dataStartValidateElement = dataStartField.getValidateElement();
ValidateElement dataStartValidateElement = ValidateElement.from(dataStartField);
assertEquals("xs:date", dataStartValidateElement.getDatatype());
assertTrue(dataStartValidateElement instanceof BasicValidateElement);
}
/**
* @param output
* @return
* @throws XmlPullParserException
* @throws IOException
*/
private static XmlPullParser getParser(String output) throws XmlPullParserException, IOException {
return TestUtils.getParser(output, "validate");
}
}