// *************************************************************************************************************************** | |
// * 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.juneau.httppart; | |
import static org.junit.Assert.*; | |
import static org.apache.juneau.testutils.TestUtils.*; | |
import static org.apache.juneau.internal.StringUtils.*; | |
import java.io.*; | |
import java.util.*; | |
import org.apache.juneau.*; | |
import org.apache.juneau.internal.*; | |
import org.apache.juneau.json.*; | |
import org.apache.juneau.oapi.*; | |
import org.junit.*; | |
import org.junit.runners.*; | |
@FixMethodOrder(MethodSorters.NAME_ASCENDING) | |
public class OpenApiPartParserTest { | |
static OpenApiParserSession p = OpenApiParser.DEFAULT.createSession(); | |
//----------------------------------------------------------------------------------------------------------------- | |
// Input validations | |
//----------------------------------------------------------------------------------------------------------------- | |
@Test | |
public void a01_inputValidations_nullInput() throws Exception { | |
HttpPartSchema s = schema().build(); | |
assertNull(p.parse(s, null, String.class)); | |
s = schema().required(false).build(); | |
assertNull(p.parse(s, null, String.class)); | |
s = schema().required().build(); | |
try { | |
p.parse(s, null, String.class); | |
fail(); | |
} catch (Exception e) { | |
assertEquals("No value specified.", e.getMessage()); | |
} | |
s = schema().required(true).build(); | |
try { | |
p.parse(s, null, String.class); | |
fail(); | |
} catch (Exception e) { | |
assertEquals("No value specified.", e.getMessage()); | |
} | |
} | |
@Test | |
public void a02_inputValidations_emptyInput() throws Exception { | |
HttpPartSchema s = schema().allowEmptyValue().build(); | |
assertEquals("", p.parse(s, "", String.class)); | |
s = schema().allowEmptyValue().build(); | |
assertEquals("", p.parse(s, "", String.class)); | |
s = schema().allowEmptyValue(false).build(); | |
try { | |
p.parse(s, "", String.class); | |
fail(); | |
} catch (Exception e) { | |
assertEquals("Empty value not allowed.", e.getMessage()); | |
} | |
try { | |
p.parse(s, "", String.class); | |
fail(); | |
} catch (Exception e) { | |
assertEquals("Empty value not allowed.", e.getMessage()); | |
} | |
assertEquals(" ", p.parse(s, " ", String.class)); | |
} | |
@Test | |
public void a03_inputValidations_pattern() throws Exception { | |
HttpPartSchema s = schema().pattern("x.*").allowEmptyValue().build(); | |
assertEquals("x", p.parse(s, "x", String.class)); | |
assertEquals("xx", p.parse(s, "xx", String.class)); | |
assertEquals(null, p.parse(s, null, String.class)); | |
try { | |
p.parse(s, "y", String.class); | |
fail(); | |
} catch (Exception e) { | |
assertEquals("Value does not match expected pattern. Must match pattern: x.*", e.getMessage()); | |
} | |
try { | |
p.parse(s, "", String.class); | |
fail(); | |
} catch (Exception e) { | |
assertEquals("Value does not match expected pattern. Must match pattern: x.*", e.getMessage()); | |
} | |
// Blank/null patterns are ignored. | |
s = schema().pattern("").allowEmptyValue().build(); | |
assertEquals("x", p.parse(s, "x", String.class)); | |
s = schema().pattern(null).allowEmptyValue().build(); | |
assertEquals("x", p.parse(s, "x", String.class)); | |
} | |
@Test | |
public void a04_inputValidations_enum() throws Exception { | |
HttpPartSchema s = schema()._enum("foo").allowEmptyValue().build(); | |
assertEquals("foo", p.parse(s, "foo", String.class)); | |
assertEquals(null, p.parse(s, null, String.class)); | |
try { | |
p.parse(s, "bar", String.class); | |
fail(); | |
} catch (Exception e) { | |
assertEquals("Value does not match one of the expected values. Must be one of the following: ['foo']", e.getMessage()); | |
} | |
try { | |
p.parse(s, "", String.class); | |
fail(); | |
} catch (Exception e) { | |
assertEquals("Value does not match one of the expected values. Must be one of the following: ['foo']", e.getMessage()); | |
} | |
s = schema()._enum((Set<String>)null).build(); | |
assertEquals("foo", p.parse(s, "foo", String.class)); | |
s = schema()._enum((Set<String>)null).allowEmptyValue().build(); | |
assertEquals("foo", p.parse(s, "foo", String.class)); | |
s = schema()._enum("foo","foo").build(); | |
assertEquals("foo", p.parse(s, "foo", String.class)); | |
} | |
@Test | |
public void a05_inputValidations_minMaxLength() throws Exception { | |
HttpPartSchema s = schema().minLength(1l).maxLength(2l).allowEmptyValue().build(); | |
assertEquals(null, p.parse(s, null, String.class)); | |
assertEquals("1", p.parse(s, "1", String.class)); | |
assertEquals("12", p.parse(s, "12", String.class)); | |
try { | |
p.parse(s, "", String.class); | |
fail(); | |
} catch (Exception e) { | |
assertEquals("Minimum length of value not met.", e.getMessage()); | |
} | |
try { | |
p.parse(s, "123", String.class); | |
fail(); | |
} catch (Exception e) { | |
assertEquals("Maximum length of value exceeded.", e.getMessage()); | |
} | |
try { | |
s = schema().minLength(2l).maxLength(1l).build(); | |
fail(); | |
} catch (Exception e) { | |
assertTrue(e.getMessage().contains("maxLength cannot be less than minLength.")); | |
} | |
try { | |
s = schema().minLength(-2l).build(); | |
fail(); | |
} catch (Exception e) { | |
assertTrue(e.getMessage().contains("minLength cannot be less than zero.")); | |
} | |
try { | |
s = schema().maxLength(-2l).build(); | |
fail(); | |
} catch (Exception e) { | |
assertTrue(e.getMessage().contains("maxLength cannot be less than zero.")); | |
} | |
} | |
//----------------------------------------------------------------------------------------------------------------- | |
// Primitive defaults | |
//----------------------------------------------------------------------------------------------------------------- | |
@Test | |
public void b01_primitiveDefaults() throws Exception { | |
assertEquals(null, p.parse(null, null, Boolean.class)); | |
assertEquals(false, p.parse(null, null, boolean.class)); | |
assertEquals(null, p.parse(null, null, Character.class)); | |
assertEquals("\0", p.parse(null, null, char.class).toString()); | |
assertEquals(null, p.parse(null, null, Short.class)); | |
assertEquals(0, p.parse(null, null, short.class).intValue()); | |
assertEquals(null, p.parse(null, null, Integer.class)); | |
assertEquals(0, p.parse(null, null, int.class).intValue()); | |
assertEquals(null, p.parse(null, null, Long.class)); | |
assertEquals(0, p.parse(null, null, long.class).intValue()); | |
assertEquals(null, p.parse(null, null, Float.class)); | |
assertEquals(0, p.parse(null, null, float.class).intValue()); | |
assertEquals(null, p.parse(null, null, Double.class)); | |
assertEquals(0, p.parse(null, null, double.class).intValue()); | |
assertEquals(null, p.parse(null, null, Byte.class)); | |
assertEquals(0, p.parse(null, null, byte.class).intValue()); | |
} | |
@Test | |
public void b02_primitiveDefaults_nullKeyword() throws Exception { | |
assertEquals(null, p.parse(null, "null", Boolean.class)); | |
assertEquals(false, p.parse(null, "null", boolean.class)); | |
assertEquals(null, p.parse(null, "null", Character.class)); | |
assertEquals("\0", p.parse(null, "null", char.class).toString()); | |
assertEquals(null, p.parse(null, "null", Short.class)); | |
assertEquals(0, p.parse(null, "null", short.class).intValue()); | |
assertEquals(null, p.parse(null, "null", Integer.class)); | |
assertEquals(0, p.parse(null, "null", int.class).intValue()); | |
assertEquals(null, p.parse(null, "null", Long.class)); | |
assertEquals(0, p.parse(null, "null", long.class).intValue()); | |
assertEquals(null, p.parse(null, "null", Float.class)); | |
assertEquals(0, p.parse(null, "null", float.class).intValue()); | |
assertEquals(null, p.parse(null, "null", Double.class)); | |
assertEquals(0, p.parse(null, "null", double.class).intValue()); | |
assertEquals(null, p.parse(null, "null", Byte.class)); | |
assertEquals(0, p.parse(null, "null", byte.class).intValue()); | |
} | |
//----------------------------------------------------------------------------------------------------------------- | |
// type = string | |
//----------------------------------------------------------------------------------------------------------------- | |
public static class C1 { | |
private String f; | |
public C1(byte[] b) { | |
f = "C1-" + new String(b); | |
} | |
@Override | |
public String toString() { | |
return f; | |
} | |
} | |
public static class C2 { | |
private String f; | |
public C2(String s) { | |
f = "C2-" + s; | |
} | |
@Override | |
public String toString() { | |
return f; | |
} | |
} | |
public static class C3 { | |
private String f; | |
public C3(String[] in) { | |
f = "C3-" + SimpleJsonSerializer.DEFAULT.toString(in); | |
} | |
@Override | |
public String toString() { | |
return f; | |
} | |
} | |
@Test | |
public void c01_stringType_simple() throws Exception { | |
HttpPartSchema s = schema("string").build(); | |
assertEquals("foo", p.parse(s, "foo", String.class)); | |
} | |
@Test | |
public void c02_stringType_default() throws Exception { | |
HttpPartSchema s = schema("string")._default("x").build(); | |
assertEquals("foo", p.parse(s, "foo", String.class)); | |
assertEquals("x", p.parse(s, null, String.class)); | |
} | |
@Test | |
public void c03_stringType_byteFormat() throws Exception { | |
HttpPartSchema s = schema("string", "byte").build(); | |
String in = base64Encode("foo".getBytes()); | |
assertEquals("foo", p.parse(s, in, String.class)); | |
assertEquals("foo", IOUtils.read(p.parse(s, in, InputStream.class))); | |
assertEquals("foo", IOUtils.read(p.parse(s, in, Reader.class))); | |
assertEquals("C1-foo", p.parse(s, in, C1.class).toString()); | |
} | |
@Test | |
public void c04_stringType_binaryFormat() throws Exception { | |
HttpPartSchema s = schema("string", "binary").build(); | |
String in = toHex("foo".getBytes()); | |
assertEquals("foo", p.parse(s, in, String.class)); | |
assertEquals("foo", IOUtils.read(p.parse(s, in, InputStream.class))); | |
assertEquals("foo", IOUtils.read(p.parse(s, in, Reader.class))); | |
assertEquals("C1-foo", p.parse(s, in, C1.class).toString()); | |
} | |
@Test | |
public void c05_stringType_binarySpacedFormat() throws Exception { | |
HttpPartSchema s = schema("string", "binary-spaced").build(); | |
String in = toSpacedHex("foo".getBytes()); | |
assertEquals("foo", p.parse(s, in, String.class)); | |
assertEquals("foo", IOUtils.read(p.parse(s, in, InputStream.class))); | |
assertEquals("foo", IOUtils.read(p.parse(s, in, Reader.class))); | |
assertEquals("C1-foo", p.parse(s, in, C1.class).toString()); | |
} | |
@Test | |
public void c06_stringType_dateFormat() throws Exception { | |
HttpPartSchema s = schema("string", "date").build(); | |
String in = "2012-12-21"; | |
assertTrue(p.parse(s, in, String.class).contains("2012")); | |
assertTrue(p.parse(s, in, Date.class).toString().contains("2012")); | |
assertEquals(2012, p.parse(s, in, Calendar.class).get(Calendar.YEAR)); | |
assertEquals(2012, p.parse(s, in, GregorianCalendar.class).get(Calendar.YEAR)); | |
} | |
@Test | |
public void c07_stringType_dateTimeFormat() throws Exception { | |
HttpPartSchema s = schema("string", "date-time").build(); | |
String in = "2012-12-21T12:34:56.789"; | |
assertTrue(p.parse(s, in, String.class).contains("2012")); | |
assertTrue(p.parse(s, in, Date.class).toString().contains("2012")); | |
assertEquals(2012, p.parse(s, in, Calendar.class).get(Calendar.YEAR)); | |
assertEquals(2012, p.parse(s, in, GregorianCalendar.class).get(Calendar.YEAR)); | |
} | |
@Test | |
public void c08_stringType_uonFormat() throws Exception { | |
HttpPartSchema s = schema("string", "uon").build(); | |
assertEquals("foo", p.parse(s, "foo", String.class)); | |
assertEquals("foo", p.parse(s, "'foo'", String.class)); | |
assertEquals("C2-foo", p.parse(s, "'foo'", C2.class).toString()); | |
// UonPartParserTest should handle all other cases. | |
} | |
@Test | |
public void c09_stringType_noneFormat() throws Exception { | |
// If no format is specified, then we should transform directly from a string. | |
HttpPartSchema s = schema("string").build(); | |
assertEquals("foo", p.parse(s, "foo", String.class)); | |
assertEquals("'foo'", p.parse(s, "'foo'", String.class)); | |
assertEquals("C2-foo", p.parse(s, "foo", C2.class).toString()); | |
} | |
@Test | |
public void c10_stringType_noneFormat_2d() throws Exception { | |
HttpPartSchema s = schema("array").items(schema("string")).build(); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar", String[].class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar", List.class, String.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar", Object[].class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar", List.class, Object.class)); | |
Object o = p.parse(s, "foo,bar", Object.class); | |
assertObjectEquals("['foo','bar']", o); | |
assertClass(ObjectList.class, o); | |
assertObjectEquals("['C2-foo','C2-bar']", p.parse(s, "foo,bar", C2[].class)); | |
assertObjectEquals("['C2-foo','C2-bar']", p.parse(s, "foo,bar", List.class, C2.class)); | |
assertEquals("C3-['foo','bar']", p.parse(s, "foo,bar", C3.class).toString()); | |
} | |
@Test | |
public void c11_stringType_noneFormat_3d() throws Exception { | |
HttpPartSchema s = schema("array").collectionFormat("pipes").items(schema("array").items(schema("string"))).build(); | |
assertObjectEquals("[['foo','bar'],['baz']]", p.parse(s, "foo,bar|baz", String[][].class)); | |
assertObjectEquals("[['foo','bar'],['baz']]", p.parse(s, "foo,bar|baz", List.class, String[].class)); | |
assertObjectEquals("[['foo','bar'],['baz']]", p.parse(s, "foo,bar|baz", List.class, List.class, String.class)); | |
assertObjectEquals("[['foo','bar'],['baz']]", p.parse(s, "foo,bar|baz", Object[][].class)); | |
assertObjectEquals("[['foo','bar'],['baz']]", p.parse(s, "foo,bar|baz", List.class, Object[].class)); | |
assertObjectEquals("[['foo','bar'],['baz']]", p.parse(s, "foo,bar|baz", List.class, List.class, Object.class)); | |
Object o = p.parse(s, "foo,bar|baz", Object.class); | |
assertObjectEquals("[['foo','bar'],['baz']]", o); | |
assertClass(ObjectList.class, o); | |
assertObjectEquals("[['C2-foo','C2-bar'],['C2-baz']]", p.parse(s, "foo,bar|baz", C2[][].class)); | |
assertObjectEquals("[['C2-foo','C2-bar'],['C2-baz']]", p.parse(s, "foo,bar|baz", List.class, C2[].class)); | |
assertObjectEquals("[['C2-foo','C2-bar'],['C2-baz']]", p.parse(s, "foo,bar|baz", List.class, List.class, C2.class)); | |
assertObjectEquals("['C3-[\\'foo\\',\\'bar\\']','C3-[\\'baz\\']']", p.parse(s, "foo,bar|baz", C3[].class)); | |
assertObjectEquals("['C3-[\\'foo\\',\\'bar\\']','C3-[\\'baz\\']']", p.parse(s, "foo,bar|baz", List.class, C3.class)); | |
} | |
@Test | |
public void c12a_stringType_nullKeyword_plain() throws Exception { | |
HttpPartSchema s = schema("string").build(); | |
assertEquals("null", p.parse(s, "null", String.class)); | |
} | |
@Test | |
public void c12b_stringType_nullKeyword_plain_2d() throws Exception { | |
HttpPartSchema s = schema("array").items(schema("string")).build(); | |
assertObjectEquals("['null']", p.parse(s, "null", String[].class)); | |
assertObjectEquals("[null]", p.parse(s, "@(null)", String[].class)); | |
} | |
@Test | |
public void c12c_stringType_nullKeyword_uon() throws Exception { | |
HttpPartSchema s = schema("string","uon").build(); | |
assertEquals(null, p.parse(s, "null", String.class)); | |
assertEquals("null", p.parse(s, "'null'", String.class)); | |
} | |
@Test | |
public void c12d_stringType_nullKeyword_uon_2d() throws Exception { | |
HttpPartSchema s = schema("array").items(schema("string","uon")).build(); | |
assertObjectEquals("[null,'x']", p.parse(s, "null,x", String[].class)); | |
assertObjectEquals("[null]", p.parse(s, "null", String[].class)); | |
assertObjectEquals("[null]", p.parse(s, "@(null)", String[].class)); | |
assertObjectEquals("['null']", p.parse(s, "'null'", String[].class)); | |
assertObjectEquals("['null']", p.parse(s, "@('null')", String[].class)); | |
} | |
//----------------------------------------------------------------------------------------------------------------- | |
// type = array | |
//----------------------------------------------------------------------------------------------------------------- | |
public static class D { | |
private String f; | |
public D(String in) { | |
this.f = "D-" + in; | |
} | |
@Override | |
public String toString() { | |
return f; | |
} | |
} | |
@Test | |
public void d01_arrayType_collectionFormatCsv() throws Exception { | |
HttpPartSchema s = schema("array").collectionFormat("csv").build(); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar", String[].class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar", Object[].class)); | |
assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo,bar", D[].class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar", List.class, String.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar", List.class, Object.class)); | |
assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo,bar", List.class, D.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar", Object.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar", ObjectList.class)); | |
} | |
@Test | |
public void d02_arrayType_collectionFormatPipes() throws Exception { | |
HttpPartSchema s = schema("array").collectionFormat("pipes").build(); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo|bar", String[].class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo|bar", Object[].class)); | |
assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo|bar", D[].class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo|bar", List.class, String.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo|bar", List.class, Object.class)); | |
assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo|bar", List.class, D.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo|bar", Object.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo|bar", ObjectList.class)); | |
} | |
@Test | |
public void d03_arrayType_collectionFormatSsv() throws Exception { | |
HttpPartSchema s = schema("array").collectionFormat("ssv").build(); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo bar", String[].class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo bar", Object[].class)); | |
assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo bar", D[].class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo bar", List.class, String.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo bar", List.class, Object.class)); | |
assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo bar", List.class, D.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo bar", Object.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo bar", ObjectList.class)); | |
} | |
@Test | |
public void d04_arrayType_collectionFormatTsv() throws Exception { | |
HttpPartSchema s = schema("array").collectionFormat("tsv").build(); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo\tbar", String[].class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo\tbar", Object[].class)); | |
assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo\tbar", D[].class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo\tbar", List.class, String.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo\tbar", List.class, Object.class)); | |
assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo\tbar", List.class, D.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo\tbar", Object.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo\tbar", ObjectList.class)); | |
} | |
@Test | |
public void d05_arrayType_collectionFormatUon() throws Exception { | |
HttpPartSchema s = schema("array").collectionFormat("uon").build(); | |
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)", String[].class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)", Object[].class)); | |
assertObjectEquals("['D-foo','D-bar']", p.parse(s, "@(foo,bar)", D[].class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)", List.class, String.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)", List.class, Object.class)); | |
assertObjectEquals("['D-foo','D-bar']", p.parse(s, "@(foo,bar)", List.class, D.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)", Object.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)", ObjectList.class)); | |
} | |
@Test | |
public void d06a_arrayType_collectionFormatNone() throws Exception { | |
HttpPartSchema s = schema("array").build(); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar", String[].class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar", Object[].class)); | |
assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo,bar", D[].class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar", List.class, String.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar", List.class, Object.class)); | |
assertObjectEquals("['D-foo','D-bar']", p.parse(s, "foo,bar", List.class, D.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "foo,bar", Object.class)); | |
} | |
@Test | |
public void d06b_arrayType_collectionFormatNone_autoDetectUon() throws Exception { | |
HttpPartSchema s = schema("array").build(); | |
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)", String[].class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)", Object[].class)); | |
assertObjectEquals("['D-foo','D-bar']", p.parse(s, "@(foo,bar)", D[].class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)", List.class, String.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)", List.class, Object.class)); | |
assertObjectEquals("['D-foo','D-bar']", p.parse(s, "@(foo,bar)", List.class, D.class)); | |
assertObjectEquals("['foo','bar']", p.parse(s, "@(foo,bar)", Object.class)); | |
} | |
@Test | |
public void d07_arrayType_collectionFormatMulti() throws Exception { | |
// collectionFormat=multi should not do any sort of splitting. | |
HttpPartSchema s = schema("array").collectionFormat("multi").build(); | |
assertObjectEquals("['foo,bar']", p.parse(s, "foo,bar", String[].class)); | |
assertObjectEquals("['foo,bar']", p.parse(s, "foo,bar", Object[].class)); | |
assertObjectEquals("['D-foo,bar']", p.parse(s, "foo,bar", D[].class)); | |
assertObjectEquals("['foo,bar']", p.parse(s, "foo,bar", List.class, String.class)); | |
assertObjectEquals("['foo,bar']", p.parse(s, "foo,bar", List.class, Object.class)); | |
assertObjectEquals("['D-foo,bar']", p.parse(s, "foo,bar", List.class, D.class)); | |
assertObjectEquals("['foo,bar']", p.parse(s, "foo,bar", Object.class)); | |
} | |
@Test | |
public void d08_arrayType_collectionFormatCsvAndPipes() throws Exception { | |
HttpPartSchema s = schema("array").collectionFormat("pipes").items(schema("array").collectionFormat("csv")).build(); | |
assertObjectEquals("[['foo','bar'],['baz','qux']]", p.parse(s, "foo,bar|baz,qux", String[][].class)); | |
assertObjectEquals("[['foo','bar'],['baz','qux']]", p.parse(s, "foo,bar|baz,qux", Object[][].class)); | |
assertObjectEquals("[['D-foo','D-bar'],['D-baz','D-qux']]", p.parse(s, "foo,bar|baz,qux", D[][].class)); | |
assertObjectEquals("[['foo','bar'],['baz','qux']]", p.parse(s, "foo,bar|baz,qux", List.class, List.class, String.class)); | |
assertObjectEquals("[['foo','bar'],['baz','qux']]", p.parse(s, "foo,bar|baz,qux", List.class, List.class, Object.class)); | |
assertObjectEquals("[['D-foo','D-bar'],['D-baz','D-qux']]", p.parse(s, "foo,bar|baz,qux", List.class, List.class, D.class)); | |
assertObjectEquals("[['foo','bar'],['baz','qux']]", p.parse(s, "foo,bar|baz,qux", Object.class)); | |
} | |
@Test | |
public void d09_arrayType_itemsBoolean() throws Exception { | |
HttpPartSchema s = schema("array").collectionFormat("csv").items(schema("boolean")).build(); | |
assertObjectEquals("[true,false]", p.parse(s, "true,false", boolean[].class)); | |
assertObjectEquals("[true,false,null]", p.parse(s, "true,false,null", Boolean[].class)); | |
assertObjectEquals("[true,false,null]", p.parse(s, "true,false,null", Object[].class)); | |
assertObjectEquals("[true,false,null]", p.parse(s, "true,false,null", List.class, Boolean.class)); | |
assertObjectEquals("[true,false,null]", p.parse(s, "true,false,null", List.class, Object.class)); | |
assertObjectEquals("[true,false,null]", p.parse(s, "true,false,null", Object.class)); | |
} | |
@Test | |
public void d10_arrayType_itemsInteger() throws Exception { | |
HttpPartSchema s = schema("array").collectionFormat("csv").items(schema("integer")).build(); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", int[].class)); | |
assertObjectEquals("[1,2,null]", p.parse(s, "1,2,null", Integer[].class)); | |
assertObjectEquals("[1,2,null]", p.parse(s, "1,2,null", Object[].class)); | |
assertObjectEquals("[1,2,null]", p.parse(s, "1,2,null", List.class, Integer.class)); | |
assertObjectEquals("[1,2,null]", p.parse(s, "1,2,null", List.class, Object.class)); | |
assertObjectEquals("[1,2,null]", p.parse(s, "1,2,null", Object.class)); | |
} | |
@Test | |
public void d11_arrayType_itemsFloat() throws Exception { | |
HttpPartSchema s = schema("array").collectionFormat("csv").items(schema("number")).build(); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1.0,2.0", float[].class)); | |
assertObjectEquals("[1.0,2.0,null]", p.parse(s, "1.0,2.0,null", Float[].class)); | |
assertObjectEquals("[1.0,2.0,null]", p.parse(s, "1.0,2.0,null", Object[].class)); | |
assertObjectEquals("[1.0,2.0,null]", p.parse(s, "1.0,2.0,null", List.class, Float.class)); | |
assertObjectEquals("[1.0,2.0,null]", p.parse(s, "1.0,2.0,null", List.class, Object.class)); | |
assertObjectEquals("[1.0,2.0,null]", p.parse(s, "1.0,2.0,null", Object.class)); | |
} | |
//----------------------------------------------------------------------------------------------------------------- | |
// type = boolean | |
//----------------------------------------------------------------------------------------------------------------- | |
public static class E1 { | |
private String f; | |
public E1(Boolean in) { | |
this.f = "E1-" + in.toString(); | |
} | |
@Override | |
public String toString() { | |
return f; | |
} | |
} | |
public static class E2 { | |
private String f; | |
public E2(Boolean[] in) { | |
this.f = "E2-" + SimpleJsonSerializer.DEFAULT.toString(in); | |
} | |
@Override | |
public String toString() { | |
return f; | |
} | |
} | |
@Test | |
public void e01_booleanType() throws Exception { | |
HttpPartSchema s = schema("boolean").build(); | |
assertEquals(true, p.parse(s, "true", boolean.class)); | |
assertEquals(true, p.parse(s, "true", Boolean.class)); | |
assertNull(p.parse(s, "null", Boolean.class)); | |
assertEquals(true, p.parse(s, "True", boolean.class)); | |
assertEquals(true, p.parse(s, "TRUE", boolean.class)); | |
assertEquals("true", p.parse(s, "true", String.class)); | |
assertNull(p.parse(s, "null", String.class)); | |
assertEquals(true, p.parse(s, "true", Object.class)); | |
assertNull(p.parse(s, "null", Object.class)); | |
assertObjectEquals("'E1-true'", p.parse(s, "true", E1.class)); | |
assertNull(p.parse(s, "null", E1.class)); | |
} | |
@Test | |
public void e02_booleanType_2d() throws Exception { | |
HttpPartSchema s = schema("array").items(schema("boolean")).build(); | |
assertObjectEquals("[true,true]", p.parse(s, "true,true", boolean[].class)); | |
assertObjectEquals("[true,true,null]", p.parse(s, "true,true,null", Boolean[].class)); | |
assertObjectEquals("[true,true,null]", p.parse(s, "true,true,null", List.class, Boolean.class)); | |
assertObjectEquals("['true','true',null]", p.parse(s, "true,true,null", String[].class)); | |
assertObjectEquals("['true','true',null]", p.parse(s, "true,true,null", List.class, String.class)); | |
assertObjectEquals("[true,true,null]", p.parse(s, "true,true,null", Object[].class)); | |
assertObjectEquals("[true,true,null]", p.parse(s, "true,true,null", List.class, Object.class)); | |
assertObjectEquals("['E1-true','E1-true',null]", p.parse(s, "true,true,null", E1[].class)); | |
assertObjectEquals("['E1-true','E1-true',null]", p.parse(s, "true,true,null", List.class, E1.class)); | |
assertObjectEquals("'E2-[true,true,null]'", p.parse(s, "true,true,null", E2.class)); | |
assertObjectEquals("[true,true]", p.parse(s, "True,true", boolean[].class)); | |
assertObjectEquals("[true,true]", p.parse(s, "TRUE,true", boolean[].class)); | |
} | |
@Test | |
public void e03_booleanType_3d() throws Exception { | |
HttpPartSchema s = schema("array").collectionFormat("pipes").items(schema("array").items(schema("boolean"))).build(); | |
assertObjectEquals("[[true,true],[false]]", p.parse(s, "true,true|false", boolean[][].class)); | |
assertObjectEquals("[[true,true],[false]]", p.parse(s, "true,true|false", List.class, boolean[].class)); | |
assertObjectEquals("[[true,true],[false,null]]", p.parse(s, "true,true|false,null", Boolean[][].class)); | |
assertObjectEquals("[[true,true],[false,null]]", p.parse(s, "true,true|false,null", List.class, Boolean[].class)); | |
assertObjectEquals("[[true,true],[false,null]]", p.parse(s, "true,true|false,null", List.class, List.class, Boolean.class)); | |
assertObjectEquals("[['true','true'],['false',null]]", p.parse(s, "true,true|false,null", String[][].class)); | |
assertObjectEquals("[['true','true'],['false',null]]", p.parse(s, "true,true|false,null", List.class, List.class, String.class)); | |
assertObjectEquals("[['true','true'],['false',null]]", p.parse(s, "true,true|false,null", List.class, String[].class)); | |
assertObjectEquals("[[true,true],[false,null]]", p.parse(s, "true,true|false,null", Object[][].class)); | |
assertObjectEquals("[[true,true],[false,null]]", p.parse(s, "true,true|false,null", List.class, List.class, Object.class)); | |
assertObjectEquals("[[true,true],[false,null]]", p.parse(s, "true,true|false,null", List.class, Object[].class)); | |
assertObjectEquals("[['E1-true','E1-true'],['E1-false',null]]", p.parse(s, "true,true|false,null", E1[][].class)); | |
assertObjectEquals("[['E1-true','E1-true'],['E1-false',null]]", p.parse(s, "true,true|false,null", List.class, List.class, E1.class)); | |
assertObjectEquals("[['E1-true','E1-true'],['E1-false',null]]", p.parse(s, "true,true|false,null", List.class, E1[].class)); | |
assertObjectEquals("['E2-[true,true]','E2-[false,null]']", p.parse(s, "true,true|false,null", E2[].class)); | |
assertObjectEquals("['E2-[true,true]','E2-[false,null]']", p.parse(s, "true,true|false,null", List.class, E2.class)); | |
assertObjectEquals("[[true,true],[false]]", p.parse(s, "True,true|false", boolean[][].class)); | |
assertObjectEquals("[[true,true],[false]]", p.parse(s, "TRUE,true|false", boolean[][].class)); | |
} | |
//----------------------------------------------------------------------------------------------------------------- | |
// type = integer | |
//----------------------------------------------------------------------------------------------------------------- | |
public static class F1 { | |
private String f; | |
public F1(Integer in) { | |
this.f = "F1-" + in.toString(); | |
} | |
@Override | |
public String toString() { | |
return f; | |
} | |
} | |
public static class F2 { | |
private String f; | |
public F2(Integer[] in) { | |
this.f = "F2-" + SimpleJsonSerializer.DEFAULT.toString(in); | |
} | |
@Override | |
public String toString() { | |
return f; | |
} | |
} | |
public static class F3 { | |
private Long f; | |
public F3(Long in) { | |
this.f = in; | |
} | |
public Long toLong() { | |
return f; | |
} | |
} | |
public static class F4 { | |
private String f; | |
public F4(Long[] in) { | |
this.f = "F4-" + SimpleJsonSerializer.DEFAULT.toString(in); | |
} | |
@Override | |
public String toString() { | |
return f; | |
} | |
} | |
@Test | |
public void f01_integerType_int32() throws Exception { | |
HttpPartSchema s = schema("integer", "int32").build(); | |
assertObjectEquals("1", p.parse(s, "1", int.class)); | |
assertObjectEquals("1", p.parse(s, "1", Integer.class)); | |
assertObjectEquals("1", p.parse(s, "1", short.class)); | |
assertObjectEquals("1", p.parse(s, "1", Short.class)); | |
assertObjectEquals("1", p.parse(s, "1", long.class)); | |
assertObjectEquals("1", p.parse(s, "1", Long.class)); | |
assertObjectEquals("'1'", p.parse(s, "1", String.class)); | |
Object o = p.parse(s, "1", Object.class); | |
assertObjectEquals("1", o); | |
assertClass(Integer.class, o); | |
assertObjectEquals("'F1-1'", p.parse(s, "1", F1.class)); | |
} | |
@Test | |
public void f02_integerType_int32_2d() throws Exception { | |
HttpPartSchema s = schema("array").items(schema("integer", "int32")).build(); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", int[].class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", Integer[].class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", List.class, Integer.class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", short[].class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", Short[].class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", List.class, Short.class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", long[].class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", Long[].class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", List.class, Long.class)); | |
assertObjectEquals("['1','2']", p.parse(s, "1,2", String[].class)); | |
assertObjectEquals("['1','2']", p.parse(s, "1,2", List.class, String.class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", Object[].class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", List.class, Object.class)); | |
assertObjectEquals("['F1-1','F1-2']", p.parse(s, "1,2", F1[].class)); | |
assertObjectEquals("['F1-1','F1-2']", p.parse(s, "1,2", List.class, F1.class)); | |
assertObjectEquals("'F2-[1,2]'", p.parse(s, "1,2", F2.class)); | |
} | |
@Test | |
public void f03_integerType_int32_3d() throws Exception { | |
HttpPartSchema s = schema("array").collectionFormat("pipes").items(schema("array").items(schema("integer", "int32"))).build(); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", int[][].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, int[].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", Integer[][].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, Integer[].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, List.class, Integer.class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", short[][].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, short[].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", Short[][].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, Short[].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, List.class, Short.class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", long[][].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, long[].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", Long[][].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, Long[].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, List.class, Long.class)); | |
assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3", String[][].class)); | |
assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3", List.class, String[].class)); | |
assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3", List.class, List.class, String.class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", Object[][].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, Object[].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, List.class, Object.class)); | |
assertObjectEquals("[['F1-1','F1-2'],['F1-3']]", p.parse(s, "1,2|3", F1[][].class)); | |
assertObjectEquals("[['F1-1','F1-2'],['F1-3']]", p.parse(s, "1,2|3", List.class, F1[].class)); | |
assertObjectEquals("[['F1-1','F1-2'],['F1-3']]", p.parse(s, "1,2|3", List.class, List.class, F1.class)); | |
assertObjectEquals("['F2-[1,2]','F2-[3]']", p.parse(s, "1,2|3", F2[].class)); | |
assertObjectEquals("['F2-[1,2]','F2-[3]']", p.parse(s, "1,2|3", List.class, F2.class)); | |
} | |
@Test | |
public void f04_integerType_int64() throws Exception { | |
HttpPartSchema s = schema("integer", "int64").build(); | |
assertObjectEquals("1", p.parse(s, "1", int.class)); | |
assertObjectEquals("1", p.parse(s, "1", Integer.class)); | |
assertObjectEquals("1", p.parse(s, "1", short.class)); | |
assertObjectEquals("1", p.parse(s, "1", Short.class)); | |
assertObjectEquals("1", p.parse(s, "1", long.class)); | |
assertObjectEquals("1", p.parse(s, "1", Long.class)); | |
assertObjectEquals("'1'", p.parse(s, "1", String.class)); | |
Object o = p.parse(s, "1", Object.class); | |
assertObjectEquals("1", o); | |
assertClass(Long.class, o); | |
assertObjectEquals("1", p.parse(s, "1", F3.class)); | |
} | |
@Test | |
public void f05_integerType_int64_2d() throws Exception { | |
HttpPartSchema s = schema("array").items(schema("integer", "int64")).build(); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", int[].class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", Integer[].class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", List.class, Integer.class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", short[].class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", Short[].class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", List.class, Short.class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", long[].class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", Long[].class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", List.class, Long.class)); | |
assertObjectEquals("['1','2']", p.parse(s, "1,2", String[].class)); | |
assertObjectEquals("['1','2']", p.parse(s, "1,2", List.class, String.class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", Object[].class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", List.class, Object.class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", F3[].class)); | |
assertObjectEquals("[1,2]", p.parse(s, "1,2", List.class, F3.class)); | |
assertObjectEquals("'F4-[1,2]'", p.parse(s, "1,2", F4.class)); | |
} | |
@Test | |
public void f06_integerType_int64_3d() throws Exception { | |
HttpPartSchema s = schema("array").collectionFormat("pipes").items(schema("array").items(schema("integer", "int64"))).build(); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", int[][].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, int[].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", Integer[][].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, Integer[].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, List.class, Integer.class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", short[][].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, short[].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", Short[][].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, Short[].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, List.class, Short.class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", long[][].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, long[].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", Long[][].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, Long[].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, List.class, Long.class)); | |
assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3", String[][].class)); | |
assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3", List.class, String[].class)); | |
assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3", List.class, List.class, String.class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", Object[][].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, Object[].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, List.class, Object.class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", F3[][].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, F3[].class)); | |
assertObjectEquals("[[1,2],[3]]", p.parse(s, "1,2|3", List.class, List.class, F3.class)); | |
assertObjectEquals("['F4-[1,2]','F4-[3]']", p.parse(s, "1,2|3", F4[].class)); | |
assertObjectEquals("['F4-[1,2]','F4-[3]']", p.parse(s, "1,2|3", List.class, F4.class)); | |
} | |
//----------------------------------------------------------------------------------------------------------------- | |
// type = number | |
//----------------------------------------------------------------------------------------------------------------- | |
public static class G1 { | |
private float f; | |
public G1(float in) { | |
this.f = in; | |
} | |
public float toFloat() { | |
return f; | |
} | |
} | |
public static class G2 { | |
private String f; | |
public G2(Float[] in) { | |
this.f = "G2-" + SimpleJsonSerializer.DEFAULT.toString(in); | |
} | |
@Override | |
public String toString() { | |
return f; | |
} | |
} | |
public static class G3 { | |
private Double f; | |
public G3(double in) { | |
this.f = in; | |
} | |
public double toDouble() { | |
return f; | |
} | |
} | |
public static class G4 { | |
private String f; | |
public G4(Double[] in) { | |
this.f = "G4-" + SimpleJsonSerializer.DEFAULT.toString(in); | |
} | |
@Override | |
public String toString() { | |
return f; | |
} | |
} | |
@Test | |
public void g01_numberType_float() throws Exception { | |
HttpPartSchema s = schema("number", "float").build(); | |
assertObjectEquals("1.0", p.parse(s, "1", float.class)); | |
assertObjectEquals("1.0", p.parse(s, "1", Float.class)); | |
assertObjectEquals("1.0", p.parse(s, "1", double.class)); | |
assertObjectEquals("1.0", p.parse(s, "1", Double.class)); | |
assertObjectEquals("'1'", p.parse(s, "1", String.class)); | |
Object o = p.parse(s, "1", Object.class); | |
assertObjectEquals("1.0",o); | |
assertClass(Float.class, o); | |
assertObjectEquals("1.0", p.parse(s, "1", G1.class)); | |
} | |
@Test | |
public void g02_numberType_float_2d() throws Exception { | |
HttpPartSchema s = schema("array").items(schema("number", "float")).build(); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", float[].class)); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", Float[].class)); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", List.class, Float.class)); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", double[].class)); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", Double[].class)); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", List.class, Double.class)); | |
assertObjectEquals("['1','2']", p.parse(s, "1,2", String[].class)); | |
assertObjectEquals("['1','2']", p.parse(s, "1,2", List.class, String.class)); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", Object[].class)); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", List.class, Object.class)); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", G1[].class)); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", List.class, G1.class)); | |
assertObjectEquals("'G2-[1.0,2.0]'", p.parse(s, "1,2", G2.class)); | |
} | |
@Test | |
public void g03_numberType_float_3d() throws Exception { | |
HttpPartSchema s = schema("array").collectionFormat("pipes").items(schema("array").items(schema("number", "float"))).build(); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", float[][].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, float[].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", Float[][].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, Float[].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, List.class, Float.class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", double[][].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, double[].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", Double[][].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, Double[].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, List.class, Double.class)); | |
assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3", String[][].class)); | |
assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3", List.class, String[].class)); | |
assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3", List.class, List.class, String.class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", Object[][].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, Object[].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, List.class, Object.class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", G1[][].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, G1[].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, List.class, G1.class)); | |
assertObjectEquals("['G2-[1.0,2.0]','G2-[3.0]']", p.parse(s, "1,2|3", G2[].class)); | |
assertObjectEquals("['G2-[1.0,2.0]','G2-[3.0]']", p.parse(s, "1,2|3", List.class, G2.class)); | |
} | |
@Test | |
public void g04_numberType_double() throws Exception { | |
HttpPartSchema s = schema("number", "double").build(); | |
assertObjectEquals("1.0", p.parse(s, "1", float.class)); | |
assertObjectEquals("1.0", p.parse(s, "1", Float.class)); | |
assertObjectEquals("1.0", p.parse(s, "1", double.class)); | |
assertObjectEquals("1.0", p.parse(s, "1", Double.class)); | |
assertObjectEquals("'1'", p.parse(s, "1", String.class)); | |
Object o = p.parse(s, "1", Object.class); | |
assertObjectEquals("1.0", o); | |
assertClass(Double.class, o); | |
assertObjectEquals("1.0", p.parse(s, "1", G3.class)); | |
} | |
@Test | |
public void g05_numberType_double_2d() throws Exception { | |
HttpPartSchema s = schema("array").items(schema("number", "double")).build(); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", float[].class)); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", Float[].class)); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", List.class, Float.class)); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", double[].class)); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", Double[].class)); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", List.class, Double.class)); | |
assertObjectEquals("['1','2']", p.parse(s, "1,2", String[].class)); | |
assertObjectEquals("['1','2']", p.parse(s, "1,2", List.class, String.class)); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", Object[].class)); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", List.class, Object.class)); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", G3[].class)); | |
assertObjectEquals("[1.0,2.0]", p.parse(s, "1,2", List.class, G3.class)); | |
assertObjectEquals("'G4-[1.0,2.0]'", p.parse(s, "1,2", G4.class)); | |
} | |
@Test | |
public void g06_numberType_double_3d() throws Exception { | |
HttpPartSchema s = schema("array").collectionFormat("pipes").items(schema("array").items(schema("number", "double"))).build(); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", float[][].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, float[].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", Float[][].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, Float[].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, List.class, Float.class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", double[][].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, double[].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", Double[][].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, Double[].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, List.class, Double.class)); | |
assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3", String[][].class)); | |
assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3", List.class, String[].class)); | |
assertObjectEquals("[['1','2'],['3']]", p.parse(s, "1,2|3", List.class, List.class, String.class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", Object[][].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, Object[].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, List.class, Object.class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", G3[][].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, G3[].class)); | |
assertObjectEquals("[[1.0,2.0],[3.0]]", p.parse(s, "1,2|3", List.class, List.class, G3.class)); | |
assertObjectEquals("['G4-[1.0,2.0]','G4-[3.0]']", p.parse(s, "1,2|3", G4[].class)); | |
assertObjectEquals("['G4-[1.0,2.0]','G4-[3.0]']", p.parse(s, "1,2|3", List.class, G4.class)); | |
} | |
//----------------------------------------------------------------------------------------------------------------- | |
// type = object | |
//----------------------------------------------------------------------------------------------------------------- | |
public static class H1 { | |
public int f; | |
} | |
@Test | |
public void h01_objectType() throws Exception { | |
HttpPartSchema s = HttpPartSchema.create().type("object").build(); | |
assertObjectEquals("{f:1}", p.parse(s, "(f=1)", H1.class)); | |
assertObjectEquals("{f:1}", p.parse(s, "(f=1)", ObjectMap.class)); | |
Object o = p.parse(s, "(f=1)", Object.class); | |
assertObjectEquals("{f:1}", o); | |
assertClass(ObjectMap.class, o); | |
} | |
@Test | |
public void h02_objectType_2d() throws Exception { | |
HttpPartSchema s = schema("array").format("uon").items(schema("object")).build(); | |
assertObjectEquals("[{f:1},{f:2}]", p.parse(s, "@((f=1),(f=2))", H1[].class)); | |
assertObjectEquals("[{f:1},{f:2}]", p.parse(s, "@((f=1),(f=2))", List.class, H1.class)); | |
assertObjectEquals("[{f:1},{f:2}]", p.parse(s, "@((f=1),(f=2))", ObjectMap[].class)); | |
assertObjectEquals("[{f:1},{f:2}]", p.parse(s, "@((f=1),(f=2))", List.class, ObjectMap.class)); | |
assertObjectEquals("[{f:1},{f:2}]", p.parse(s, "@((f=1),(f=2))", Object[].class)); | |
assertObjectEquals("[{f:1},{f:2}]", p.parse(s, "@((f=1),(f=2))", List.class, Object.class)); | |
Object o = p.parse(s, "@((f=1),(f=2))", Object.class); | |
assertObjectEquals("[{f:1},{f:2}]", o); | |
assertClass(ObjectList.class, o); | |
} | |
@Test | |
public void h03_objectType_3d() throws Exception { | |
HttpPartSchema s = schema("array").format("uon").items(schema("array").items(schema("object"))).build(); | |
assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", p.parse(s, "@(@((f=1),(f=2)),@((f=3)))", H1[][].class)); | |
assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", p.parse(s, "@(@((f=1),(f=2)),@((f=3)))", List.class, H1[].class)); | |
assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", p.parse(s, "@(@((f=1),(f=2)),@((f=3)))", List.class, List.class, H1.class)); | |
assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", p.parse(s, "@(@((f=1),(f=2)),@((f=3)))", ObjectMap[][].class)); | |
assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", p.parse(s, "@(@((f=1),(f=2)),@((f=3)))", List.class, ObjectMap[].class)); | |
assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", p.parse(s, "@(@((f=1),(f=2)),@((f=3)))", List.class, List.class, ObjectMap.class)); | |
assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", p.parse(s, "@(@((f=1),(f=2)),@((f=3)))", Object[][].class)); | |
assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", p.parse(s, "@(@((f=1),(f=2)),@((f=3)))", List.class, Object[].class)); | |
assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", p.parse(s, "@(@((f=1),(f=2)),@((f=3)))", List.class, List.class, Object.class)); | |
Object o = p.parse(s, "@(@((f=1),(f=2)),@((f=3)))", Object.class); | |
assertObjectEquals("[[{f:1},{f:2}],[{f:3}]]", o); | |
assertClass(ObjectList.class, o); | |
} | |
public static class H2 { | |
public Object f01, f02, f03, f04, f05, f06, f07, f08, f09, f10, f11, f12, f99; | |
} | |
@Test | |
public void h04_objectType_simpleProperties() throws Exception { | |
HttpPartSchema s = schema("object") | |
.property("f01", schema("string")) | |
.property("f02", schema("string", "byte")) | |
.property("f04", schema("string", "date-time")) | |
.property("f05", schema("string", "binary")) | |
.property("f06", schema("string", "binary-spaced")) | |
.property("f07", schema("string", "uon")) | |
.property("f08", schema("integer")) | |
.property("f09", schema("integer", "int64")) | |
.property("f10", schema("number")) | |
.property("f11", schema("number", "double")) | |
.property("f12", schema("boolean")) | |
.additionalProperties(schema("integer")) | |
.build(); | |
byte[] foob = "foo".getBytes(); | |
String in = "(f01=foo,f02="+base64Encode(foob)+",f04=2012-12-21T12:34:56Z,f05="+toHex(foob)+",f06='"+toSpacedHex(foob)+"',f07=foo,f08=1,f09=1,f10=1,f11=1,f12=true,f99=1)"; | |
H2 h2 = p.parse(s, in, H2.class); | |
assertObjectEquals("{f01:'foo',f02:[102,111,111],f04:'2012-12-21T12:34:56Z',f05:[102,111,111],f06:[102,111,111],f07:'foo',f08:1,f09:1,f10:1.0,f11:1.0,f12:true,f99:1}", h2); | |
assertClass(String.class, h2.f01); | |
assertClass(byte[].class, h2.f02); | |
assertClass(GregorianCalendar.class, h2.f04); | |
assertClass(byte[].class, h2.f05); | |
assertClass(byte[].class, h2.f06); | |
assertClass(String.class, h2.f07); | |
assertClass(Integer.class, h2.f08); | |
assertClass(Long.class, h2.f09); | |
assertClass(Float.class, h2.f10); | |
assertClass(Double.class, h2.f11); | |
assertClass(Boolean.class, h2.f12); | |
assertClass(Integer.class, h2.f99); | |
ObjectMap om = p.parse(s, in, ObjectMap.class); | |
assertObjectEquals("{f01:'foo',f02:[102,111,111],f04:'2012-12-21T12:34:56Z',f05:[102,111,111],f06:[102,111,111],f07:'foo',f08:1,f09:1,f10:1.0,f11:1.0,f12:true,f99:1}", om); | |
assertClass(String.class, om.get("f01")); | |
assertClass(byte[].class, om.get("f02")); | |
assertClass(GregorianCalendar.class, om.get("f04")); | |
assertClass(byte[].class, om.get("f05")); | |
assertClass(byte[].class, om.get("f06")); | |
assertClass(String.class, om.get("f07")); | |
assertClass(Integer.class, om.get("f08")); | |
assertClass(Long.class, om.get("f09")); | |
assertClass(Float.class, om.get("f10")); | |
assertClass(Double.class, om.get("f11")); | |
assertClass(Boolean.class, om.get("f12")); | |
assertClass(Integer.class, om.get("f99")); | |
om = (ObjectMap)p.parse(s, in, Object.class); | |
assertObjectEquals("{f01:'foo',f02:[102,111,111],f04:'2012-12-21T12:34:56Z',f05:[102,111,111],f06:[102,111,111],f07:'foo',f08:1,f09:1,f10:1.0,f11:1.0,f12:true,f99:1}", om); | |
assertClass(String.class, om.get("f01")); | |
assertClass(byte[].class, om.get("f02")); | |
assertClass(GregorianCalendar.class, om.get("f04")); | |
assertClass(byte[].class, om.get("f05")); | |
assertClass(byte[].class, om.get("f06")); | |
assertClass(String.class, om.get("f07")); | |
assertClass(Integer.class, om.get("f08")); | |
assertClass(Long.class, om.get("f09")); | |
assertClass(Float.class, om.get("f10")); | |
assertClass(Double.class, om.get("f11")); | |
assertClass(Boolean.class, om.get("f12")); | |
assertClass(Integer.class, om.get("f99")); | |
} | |
@Test | |
public void h05_objectType_arrayProperties() throws Exception { | |
HttpPartSchema s = schema("object") | |
.property("f01", schema("array").items(schema("string"))) | |
.property("f02", schema("array").items(schema("string", "byte"))) | |
.property("f04", schema("array").items(schema("string", "date-time"))) | |
.property("f05", schema("array").items(schema("string", "binary"))) | |
.property("f06", schema("array").items(schema("string", "binary-spaced"))) | |
.property("f07", schema("array").items(schema("string", "uon"))) | |
.property("f08", schema("array").items(schema("integer"))) | |
.property("f09", schema("array").items(schema("integer", "int64"))) | |
.property("f10", schema("array").items(schema("number"))) | |
.property("f11", schema("array").items(schema("number", "double"))) | |
.property("f12", schema("array").items(schema("boolean"))) | |
.additionalProperties(schema("array").items(schema("integer"))) | |
.build(); | |
byte[] foob = "foo".getBytes(); | |
String in = "(f01=foo,f02="+base64Encode(foob)+",f04=2012-12-21T12:34:56Z,f05="+toHex(foob)+",f06='"+toSpacedHex(foob)+"',f07=foo,f08=1,f09=1,f10=1,f11=1,f12=true,f99=1)"; | |
H2 h2 = p.parse(s, in, H2.class); | |
assertObjectEquals("{f01:['foo'],f02:[[102,111,111]],f04:['2012-12-21T12:34:56Z'],f05:[[102,111,111]],f06:[[102,111,111]],f07:['foo'],f08:[1],f09:[1],f10:[1.0],f11:[1.0],f12:[true],f99:[1]}", h2); | |
ObjectMap om = p.parse(s, in, ObjectMap.class); | |
assertObjectEquals("{f01:['foo'],f02:[[102,111,111]],f04:['2012-12-21T12:34:56Z'],f05:[[102,111,111]],f06:[[102,111,111]],f07:['foo'],f08:[1],f09:[1],f10:[1.0],f11:[1.0],f12:[true],f99:[1]}", om); | |
om = (ObjectMap)p.parse(s, in, Object.class); | |
assertObjectEquals("{f01:['foo'],f02:[[102,111,111]],f04:['2012-12-21T12:34:56Z'],f05:[[102,111,111]],f06:[[102,111,111]],f07:['foo'],f08:[1],f09:[1],f10:[1.0],f11:[1.0],f12:[true],f99:[1]}", om); | |
} | |
@Test | |
public void h06_objectType_arrayProperties_pipes() throws Exception { | |
HttpPartSchema s = schema("object") | |
.property("f01", schema("array").collectionFormat("pipes").items(schema("string"))) | |
.property("f02", schema("array").collectionFormat("pipes").items(schema("string", "byte"))) | |
.property("f04", schema("array").collectionFormat("pipes").items(schema("string", "date-time"))) | |
.property("f05", schema("array").collectionFormat("pipes").items(schema("string", "binary"))) | |
.property("f06", schema("array").collectionFormat("pipes").items(schema("string", "binary-spaced"))) | |
.property("f07", schema("array").collectionFormat("pipes").items(schema("string", "uon"))) | |
.property("f08", schema("array").collectionFormat("pipes").items(schema("integer"))) | |
.property("f09", schema("array").collectionFormat("pipes").items(schema("integer", "int64"))) | |
.property("f10", schema("array").collectionFormat("pipes").items(schema("number"))) | |
.property("f11", schema("array").collectionFormat("pipes").items(schema("number", "double"))) | |
.property("f12", schema("array").collectionFormat("pipes").items(schema("boolean"))) | |
.additionalProperties(schema("array").collectionFormat("pipes").items(schema("integer"))) | |
.build(); | |
byte[] foob = "foo".getBytes(), barb = "bar".getBytes(); | |
String in = "(f01=foo|bar,f02="+base64Encode(foob)+"|"+base64Encode(barb)+",f04=2012-12-21T12:34:56Z|2012-12-21T12:34:56Z,f05="+toHex(foob)+"|"+toHex(barb)+",f06='"+toSpacedHex(foob)+"|"+toSpacedHex(barb)+"',f07=foo|bar,f08=1|2,f09=1|2,f10=1|2,f11=1|2,f12=true|true,f99=1|2)"; | |
H2 h2 = p.parse(s, in, H2.class); | |
assertObjectEquals("{f01:['foo','bar'],f02:[[102,111,111],[98,97,114]],f04:['2012-12-21T12:34:56Z','2012-12-21T12:34:56Z'],f05:[[102,111,111],[98,97,114]],f06:[[102,111,111],[98,97,114]],f07:['foo','bar'],f08:[1,2],f09:[1,2],f10:[1.0,2.0],f11:[1.0,2.0],f12:[true,true],f99:[1,2]}", h2); | |
ObjectMap om = p.parse(s, in, ObjectMap.class); | |
assertObjectEquals("{f01:['foo','bar'],f02:[[102,111,111],[98,97,114]],f04:['2012-12-21T12:34:56Z','2012-12-21T12:34:56Z'],f05:[[102,111,111],[98,97,114]],f06:[[102,111,111],[98,97,114]],f07:['foo','bar'],f08:[1,2],f09:[1,2],f10:[1.0,2.0],f11:[1.0,2.0],f12:[true,true],f99:[1,2]}", om); | |
om = (ObjectMap)p.parse(s, in, Object.class); | |
assertObjectEquals("{f01:['foo','bar'],f02:[[102,111,111],[98,97,114]],f04:['2012-12-21T12:34:56Z','2012-12-21T12:34:56Z'],f05:[[102,111,111],[98,97,114]],f06:[[102,111,111],[98,97,114]],f07:['foo','bar'],f08:[1,2],f09:[1,2],f10:[1.0,2.0],f11:[1.0,2.0],f12:[true,true],f99:[1,2]}", om); | |
} | |
//----------------------------------------------------------------------------------------------------------------- | |
// Utility methods | |
//----------------------------------------------------------------------------------------------------------------- | |
private static HttpPartSchemaBuilder schema() { | |
return HttpPartSchema.create(); | |
} | |
private static HttpPartSchemaBuilder schema(String type) { | |
return HttpPartSchema.create(type); | |
} | |
private static HttpPartSchemaBuilder schema(String type, String format) { | |
return HttpPartSchema.create(type, format); | |
} | |
} |