View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.juneau.httppart;
18  
19  import static java.lang.String.*;
20  import static org.apache.juneau.TestUtils.*;
21  import static org.apache.juneau.commons.utils.CollectionUtils.*;
22  import static org.apache.juneau.commons.utils.StringUtils.*;
23  import static org.apache.juneau.httppart.HttpPartSchema.*;
24  import static org.junit.jupiter.api.Assertions.*;
25  
26  import java.util.*;
27  
28  import org.apache.juneau.*;
29  import org.apache.juneau.collections.*;
30  import org.apache.juneau.commons.time.*;
31  import org.apache.juneau.oapi.*;
32  import org.apache.juneau.serializer.*;
33  import org.junit.jupiter.api.*;
34  
35  class OpenApiPartSerializer_Test extends TestBase {
36  
37  	static OpenApiSerializerSession s = OpenApiSerializer.DEFAULT.getSession();
38  
39  	private static String serialize(HttpPartSchema schema, Object o) throws SchemaValidationException, SerializeException {
40  		return s.serialize(null, schema, o);
41  	}
42  
43  	//-----------------------------------------------------------------------------------------------------------------
44  	// Input validations
45  	//-----------------------------------------------------------------------------------------------------------------
46  
47  	@Test void a01_outputValidations_nullOutput() throws Exception {
48  		assertEquals("null", serialize(T_NONE, null));
49  		assertEquals("null", serialize(tNone().required(false).build(), null));
50  		assertThrowsWithMessage(SchemaValidationException.class, "Required value not provided.", ()->serialize(tNone().required().build(), null));
51  		assertThrowsWithMessage(SchemaValidationException.class, "Required value not provided.", ()->serialize(tNone().required(true).build(), null));
52  	}
53  
54  	@Test void a02_outputValidations_emptyOutput() throws Exception {
55  		assertEquals("", serialize(tNone().allowEmptyValue().build(), ""));
56  		assertEquals("", serialize(tNone().allowEmptyValue().build(), ""));
57  		assertThrowsWithMessage(SchemaValidationException.class, "Empty value not allowed.", ()->serialize(tNone().allowEmptyValue(false).build(), ""));
58  		assertThrowsWithMessage(SchemaValidationException.class, "Empty value not allowed.", ()->serialize(tNone().allowEmptyValue(false).build(), ""));
59  		assertEquals(" ", serialize(tNone().allowEmptyValue(false).build(), " "));
60  	}
61  
62  	@Test void a03_outputValidations_pattern() throws Exception {
63  		var ps = tNone().pattern("x.*").allowEmptyValue().build();
64  		assertEquals("x", serialize(ps, "x"));
65  		assertEquals("xx", serialize(ps, "xx"));
66  		assertEquals("null", serialize(ps, null));
67  
68  		assertThrowsWithMessage(SchemaValidationException.class, "Value does not match expected pattern.  Must match pattern: x.*", ()->serialize(ps, "y"));
69  		assertThrowsWithMessage(SchemaValidationException.class, "Value does not match expected pattern.  Must match pattern: x.*", ()->serialize(ps, ""));
70  
71  		// Blank/null patterns are ignored.
72  		assertEquals("x", serialize(tNone().pattern("").allowEmptyValue().build(), "x"));
73  		assertEquals("x", serialize(tNone().pattern(null).allowEmptyValue().build(), "x"));
74  	}
75  
76  	@Test void a04_outputValidations_enum() throws Exception {
77  		var ps = tNone().enum_("foo").allowEmptyValue().build();
78  
79  		assertEquals("foo", serialize(ps, "foo"));
80  		assertEquals("null", serialize(ps, null));
81  
82  		assertThrowsWithMessage(SchemaValidationException.class, "Value does not match one of the expected values.  Must be one of the following:  foo", ()->serialize(ps, "bar"));
83  		assertThrowsWithMessage(SchemaValidationException.class, "Value does not match one of the expected values.  Must be one of the following:  foo", ()->serialize(ps, ""));
84  
85  		assertEquals("foo", serialize(tNone().enum_((Set<String>)null).build(), "foo"));
86  		assertEquals("foo", serialize(tNone().enum_((Set<String>)null).allowEmptyValue().build(), "foo"));
87  		assertEquals("foo", serialize(tNone().enum_("foo","foo").build(), "foo"));
88  	}
89  
90  	@Test void a05_outputValidations_minMaxLength() throws Exception {
91  		var ps = tNone().minLength(1L).maxLength(2L).allowEmptyValue().build();
92  
93  		assertEquals("null", serialize(ps, null));
94  		assertEquals("1", serialize(ps, "1"));
95  		assertEquals("12", serialize(ps, "12"));
96  
97  		assertThrowsWithMessage(SchemaValidationException.class, "Minimum length of value not met.", ()->serialize(ps, ""));
98  		assertThrowsWithMessage(SchemaValidationException.class, "Maximum length of value exceeded.", ()->serialize(ps, "123"));
99  	}
100 
101 	//-----------------------------------------------------------------------------------------------------------------
102 	// type = string
103 	//-----------------------------------------------------------------------------------------------------------------
104 
105 	public static class C1 {
106 		private byte[] f;
107 		public C1(byte[] f) {
108 			this.f = f;
109 		}
110 		public byte[] toByteArray() {
111 			return f;
112 		}
113 	}
114 
115 	public static class C2 {
116 		private String f;
117 		public C2(String s) {
118 			f = s;
119 		}
120 		@Override
121 		public String toString() {
122 			return f;
123 		}
124 	}
125 
126 	public static class C3 {
127 		private String[] f;
128 		public C3(String...in) {
129 			f = in;
130 		}
131 		public String[] toStringArray() {
132 			return f;
133 		}
134 	}
135 
136 	@Test void c01_stringType_simple() throws Exception {
137 		var ps = T_STRING;
138 		assertEquals("foo", serialize(ps, "foo"));
139 	}
140 
141 	@Test void c02_stringType_default() throws Exception {
142 		var ps = tString().default_("x").build();
143 		assertEquals("foo", serialize(ps, "foo"));
144 		assertEquals("x", serialize(ps, null));
145 	}
146 
147 	@Test void c03_stringType_byteFormat() throws Exception {
148 		var ps = T_BYTE;
149 		var foob = "foo".getBytes();
150 		var expected = base64Encode(foob);
151 		assertEquals(expected, serialize(ps, foob));
152 		assertEquals(expected, serialize(ps, new C1(foob)));
153 		assertEquals("null", serialize(ps, new C1(null)));
154 		assertEquals("null", serialize(ps, null));
155 	}
156 
157 	@Test void c04_stringType_binaryFormat() throws Exception {
158 		var ps = T_BINARY;
159 		var foob = "foo".getBytes();
160 		var expected = toHex(foob);
161 		assertEquals(expected, serialize(ps, foob));
162 		assertEquals(expected, serialize(ps, new C1(foob)));
163 		assertEquals("null", serialize(ps, new C1(null)));
164 		assertEquals("null", serialize(ps, null));
165 	}
166 
167 	@Test void c05_stringType_binarySpacedFormat() throws Exception {
168 		var ps = T_BINARY_SPACED;
169 		var foob = "foo".getBytes();
170 		var expected = toSpacedHex(foob);
171 		assertEquals(expected, serialize(ps, foob));
172 		assertEquals(expected, serialize(ps, new C1(foob)));
173 		assertEquals("null", serialize(ps, new C1(null)));
174 		assertEquals("null", serialize(ps, null));
175 	}
176 
177 	@Test void c06_stringType_dateFormat() throws Exception {
178 		var ps = T_DATE;
179 		var in = opt("2012-12-21").filter(x1 -> ! isBlank(x1)).map(x -> GranularZonedDateTime.of("2012-12-21").getZonedDateTime()).map(GregorianCalendar::from).orElse(null);
180 		assertTrue(serialize(ps, in).contains("2012"));
181 		assertEquals("null", serialize(ps, null));
182 	}
183 
184 	@Test void c07_stringType_dateTimeFormat() throws Exception {
185 		var ps = T_DATETIME;
186 		var in = opt("2012-12-21T12:34:56.789").filter(x1 -> ! isBlank(x1)).map(x -> GranularZonedDateTime.of("2012-12-21T12:34:56.789").getZonedDateTime()).map(GregorianCalendar::from).orElse(null);
187 		assertTrue(serialize(ps, in).contains("2012"));
188 		assertEquals("null", serialize(ps, null));
189 	}
190 
191 	@Test void c08_stringType_uonFormat() throws Exception {
192 		var ps = T_UON;
193 		assertEquals("foo", serialize(ps, "foo"));
194 		assertEquals("~'foo~'", serialize(ps, "'foo'"));
195 		assertEquals("foo", serialize(ps, new C2("foo")));
196 		assertEquals("null", serialize(ps, new C2(null)));
197 		assertEquals("'null'", serialize(ps, new C2("null")));
198 		assertEquals("null", serialize(ps, null));
199 		// UonPartSerializerTest should handle all other cases.
200 	}
201 
202 	@Test void c09_stringType_noneFormat() throws Exception {
203 		// If no format is specified, then we should transform directly from a string.
204 		var ps = T_STRING;
205 		assertEquals("foo", serialize(ps, "foo"));
206 		assertEquals("'foo'", serialize(ps, "'foo'"));
207 		assertEquals("foo", serialize(ps, new C2("foo")));
208 		assertEquals("null", serialize(ps, new C2(null)));
209 		assertEquals("null", serialize(ps, new C2("null")));
210 		assertEquals("null", serialize(ps, null));
211 	}
212 
213 	@Test void c10_stringType_noneFormat_2d() throws Exception {
214 		var ps = tArray(tString()).build();
215 		assertEquals("foo,bar,null", serialize(ps, a("foo","bar",null)));
216 		assertEquals("foo,bar,null", serialize(ps, l("foo","bar",null)));
217 		assertEquals("foo,bar,null", serialize(ps, ao("foo","bar",null)));
218 		assertEquals("foo,bar,null", serialize(ps, l((Object)"foo",(Object)"bar",null)));
219 		assertEquals("foo,bar,null,null", serialize(ps, a(new C2("foo"),new C2("bar"),new C2(null),null)));
220 		assertEquals("foo,bar,null,null", serialize(ps, l(new C2("foo"),new C2("bar"),new C2(null),null)));
221 		assertEquals("foo,bar,null", serialize(ps, new C3("foo","bar",null)));
222 	}
223 
224 	@Test void c11_stringType_noneFormat_3d() throws Exception {
225 		var ps = tArrayPipes(tArray(tString())).build();
226 		assertEquals("foo,bar|baz,null|null", serialize(ps, a2(a("foo","bar"),a("baz",null),null)));
227 		assertEquals("foo,bar|baz,null|null", serialize(ps, l(a("foo","bar"), a("baz",null),null)));
228 		assertEquals("foo,bar|baz,null|null", serialize(ps, l(l("foo","bar"),l("baz",null),null)));
229 		assertEquals("foo,bar|baz,null|null", serialize(ps, a2(ao("foo","bar"),ao("baz",null),null)));
230 		assertEquals("foo,bar|baz,null|null", serialize(ps, l(ao("foo","bar"), a("baz",null),null)));
231 		assertEquals("foo,bar|baz,null|null", serialize(ps, l(l((Object)"foo",(Object)"bar"),l((Object)"baz",null),null)));
232 		assertEquals("foo,bar|baz,null,null|null", serialize(ps, a(a(new C2("foo"),new C2("bar")),a(new C2("baz"),new C2(null),null),null)));
233 		assertEquals("foo,bar|baz,null,null|null", serialize(ps, l(a(new C2("foo"),new C2("bar")), a(new C2("baz"),new C2(null),null),null)));
234 		assertEquals("foo,bar|baz,null,null|null", serialize(ps, l(l(new C2("foo"),new C2("bar")),l(new C2("baz"),new C2(null),null),null)));
235 		assertEquals("foo,bar|baz,null|null|null", serialize(ps, a(new C3("foo","bar"),new C3("baz",null),new C3((String)null),null)));
236 		assertEquals("foo,bar|baz,null|null|null", serialize(ps, l(new C3("foo","bar"),new C3("baz",null),new C3((String)null),null)));
237 	}
238 
239 	@Test void c12_stringType_uonKeywords_plain() throws Exception {
240 		var ps = T_STRING;
241 		// When serialized normally, the following should not be quoted.
242 		assertEquals("true", serialize(ps, "true"));
243 		assertEquals("false", serialize(ps, "false"));
244 		assertEquals("null", serialize(ps, "null"));
245 		assertEquals("null", serialize(ps, null));
246 		assertEquals("123", serialize(ps, "123"));
247 		assertEquals("1.23", serialize(ps, "1.23"));
248 	}
249 
250 	@Test void c13_stringType_uonKeywords_uon() throws Exception {
251 		var ps = T_UON;
252 		// When serialized as UON, the following should be quoted so that they're not confused with booleans or numbers.
253 		assertEquals("'true'", serialize(ps, "true"));
254 		assertEquals("'false'", serialize(ps, "false"));
255 		assertEquals("'null'", serialize(ps, "null"));
256 		assertEquals("null", serialize(ps, null));
257 		assertEquals("'123'", serialize(ps, "123"));
258 		assertEquals("'1.23'", serialize(ps, "1.23"));
259 	}
260 
261 	//-----------------------------------------------------------------------------------------------------------------
262 	// type = array
263 	//-----------------------------------------------------------------------------------------------------------------
264 
265 	public static class D {
266 		private String f;
267 		public D(String in) {
268 			this.f = in;
269 		}
270 		@Override
271 		public String toString() {
272 			return f;
273 		}
274 	}
275 
276 	@Test void d01_arrayType_collectionFormatCsv() throws Exception {
277 		var ps = T_ARRAY_CSV;
278 		assertEquals("foo,bar,null", serialize(ps, a("foo","bar",null)));
279 		assertEquals("foo,bar,null", serialize(ps, ao("foo","bar",null)));
280 		assertEquals("foo,bar,null,null", serialize(ps, a(new D("foo"),new D("bar"),new D(null),null)));
281 		assertEquals("foo,bar,null", serialize(ps, l("foo","bar",null)));
282 		assertEquals("foo,bar,null", serialize(ps, l("foo","bar",null)));
283 		assertEquals("foo,bar,null,null", serialize(ps, l(new D("foo"),new D("bar"),new D(null),null)));
284 		assertEquals("foo,bar,null", serialize(ps, JsonList.of("foo","bar",null)));
285 
286 		assertEquals("foo\\,bar,null", serialize(ps, a("foo,bar",null)));
287 	}
288 
289 	@Test void d02_arrayType_collectionFormatPipes() throws Exception {
290 		var ps = T_ARRAY_PIPES;
291 		assertEquals("foo|bar|null", serialize(ps, a("foo","bar",null)));
292 		assertEquals("foo|bar|null", serialize(ps, ao("foo","bar",null)));
293 		assertEquals("foo|bar|null|null", serialize(ps, a(new D("foo"),new D("bar"),new D(null),null)));
294 		assertEquals("foo|bar|null", serialize(ps, l("foo","bar",null)));
295 		assertEquals("foo|bar|null", serialize(ps, l("foo","bar",null)));
296 		assertEquals("foo|bar|null|null", serialize(ps, l(new D("foo"),new D("bar"),new D(null),null)));
297 		assertEquals("foo|bar|null", serialize(ps, JsonList.of("foo","bar",null)));
298 	}
299 
300 	@Test void d03_arrayType_collectionFormatSsv() throws Exception {
301 		var ps = T_ARRAY_SSV;
302 		assertEquals("foo bar null", serialize(ps, a("foo","bar",null)));
303 		assertEquals("foo bar null", serialize(ps, ao("foo","bar",null)));
304 		assertEquals("foo bar null null", serialize(ps, a(new D("foo"),new D("bar"),new D(null),null)));
305 		assertEquals("foo bar null", serialize(ps, l("foo","bar",null)));
306 		assertEquals("foo bar null", serialize(ps, l("foo","bar",null)));
307 		assertEquals("foo bar null null", serialize(ps, l(new D("foo"),new D("bar"),new D(null),null)));
308 		assertEquals("foo bar null", serialize(ps, JsonList.of("foo","bar",null)));
309 	}
310 
311 	@Test void d04_arrayType_collectionFormatTsv() throws Exception {
312 		var ps = T_ARRAY_TSV;
313 		assertEquals("foo\tbar\tnull", serialize(ps, a("foo","bar",null)));
314 		assertEquals("foo\tbar\tnull", serialize(ps, ao("foo","bar",null)));
315 		assertEquals("foo\tbar\tnull\tnull", serialize(ps, a(new D("foo"),new D("bar"),new D(null),null)));
316 		assertEquals("foo\tbar\tnull", serialize(ps, l("foo","bar",null)));
317 		assertEquals("foo\tbar\tnull", serialize(ps, l("foo","bar",null)));
318 		assertEquals("foo\tbar\tnull\tnull", serialize(ps, l(new D("foo"),new D("bar"),new D(null),null)));
319 		assertEquals("foo\tbar\tnull", serialize(ps, JsonList.of("foo","bar",null)));
320 	}
321 
322 	@Test void d05_arrayType_collectionFormatUon() throws Exception {
323 		var ps = T_ARRAY_UON;
324 		assertEquals("@(foo,bar,'null',null)", serialize(ps, a("foo","bar","null",null)));
325 		assertEquals("@(foo,bar,'null',null)", serialize(ps, ao("foo","bar","null",null)));
326 		assertEquals("@(foo,bar,'null',null)", serialize(ps, a(new D("foo"),new D("bar"),new D("null"),null)));
327 		assertEquals("@(foo,bar,'null',null)", serialize(ps, l("foo","bar","null",null)));
328 		assertEquals("@(foo,bar,'null',null)", serialize(ps, l("foo","bar","null",null)));
329 		assertEquals("@(foo,bar,'null',null)", serialize(ps, l(new D("foo"),new D("bar"),new D("null"),null)));
330 		assertEquals("@(foo,bar,'null',null)", serialize(ps, JsonList.of("foo","bar","null",null)));
331 	}
332 
333 	@Test void d06a_arrayType_collectionFormatNone() throws Exception {
334 		var ps = T_ARRAY;
335 		assertEquals("foo,bar,null", serialize(ps, a("foo","bar",null)));
336 		assertEquals("foo,bar,null", serialize(ps, ao("foo","bar",null)));
337 		assertEquals("foo,bar,null,null", serialize(ps, a(new D("foo"),new D("bar"),new D(null),null)));
338 		assertEquals("foo,bar,null", serialize(ps, l("foo","bar",null)));
339 		assertEquals("foo,bar,null", serialize(ps, l("foo","bar",null)));
340 		assertEquals("foo,bar,null,null", serialize(ps, l(new D("foo"),new D("bar"),new D(null),null)));
341 		assertEquals("foo,bar,null", serialize(ps, JsonList.of("foo","bar",null)));
342 	}
343 
344 	@Test void d07_arrayType_collectionFormatMulti() throws Exception {
345 		// collectionFormat=multi really shouldn't be applicable to collections of values, so just use csv.
346 		var ps = T_ARRAY_MULTI;
347 		assertEquals("foo,bar,null", serialize(ps, a("foo","bar",null)));
348 		assertEquals("foo,bar,null", serialize(ps, ao("foo","bar",null)));
349 		assertEquals("foo,bar,null,null", serialize(ps, a(new D("foo"),new D("bar"),new D(null),null)));
350 		assertEquals("foo,bar,null", serialize(ps, l("foo","bar",null)));
351 		assertEquals("foo,bar,null", serialize(ps, l("foo","bar",null)));
352 		assertEquals("foo,bar,null,null", serialize(ps, l(new D("foo"),new D("bar"),new D(null),null)));
353 		assertEquals("foo,bar,null", serialize(ps, JsonList.of("foo","bar",null)));
354 	}
355 
356 	@Test void d08_arrayType_collectionFormatCsvAndPipes() throws Exception {
357 		var ps = tArrayPipes(tArrayCsv()).build();
358 		assertEquals("foo,bar|baz,null|null", serialize(ps, a2(a("foo","bar"),a("baz",null),null)));
359 		assertEquals("foo,bar|baz,null|null", serialize(ps, a2(ao("foo","bar"),ao("baz",null),null)));
360 		assertEquals("foo,bar|baz,null,null|null", serialize(ps, a(a(new D("foo"),new D("bar")),a(new D("baz"),new D(null),null),null)));
361 		assertEquals("foo,bar|baz,null|null", serialize(ps, l(l("foo","bar"),l("baz",null),null)));
362 		assertEquals("foo,bar|baz,null|null", serialize(ps, l(l("foo","bar"),l("baz",null),null)));
363 		assertEquals("foo,bar|baz,null,null|null", serialize(ps, l(l(new D("foo"),new D("bar")),l(new D("baz"),new D(null),null),null)));
364 	}
365 
366 	@Test void d09_arrayType_itemsInteger() throws Exception {
367 		var ps = tArrayCsv(tInteger()).build();
368 		assertEquals("1,2", serialize(ps, ints(1,2)));
369 		assertEquals("1,2,null", serialize(ps, a(1,2,null)));
370 		assertEquals("1,2,null", serialize(ps, ao(1,2,null)));
371 		assertEquals("1,2,null", serialize(ps, l(1,2,null)));
372 	}
373 
374 	@Test void d10_arrayType_itemsInteger_2d() throws Exception {
375 		var ps = tArrayPipes(tArrayCsv(tInteger()).allowEmptyValue()).build();
376 		assertEquals("1,2||null", serialize(ps, new int[][]{{1,2},{},null}));
377 		assertEquals("1,2,null||null", serialize(ps, a(a(1,2,null),a(),null)));
378 		assertEquals("1,2,null||null", serialize(ps, a2(ao(1,2,null),ao(),null)));
379 		assertEquals("1,2,null||null", serialize(ps, l(l(1,2,null),l(),null)));
380 	}
381 
382 	//-----------------------------------------------------------------------------------------------------------------
383 	// type = boolean
384 	//-----------------------------------------------------------------------------------------------------------------
385 
386 	public static class E1 {
387 		private Boolean f;
388 		public E1(Boolean in) {
389 			this.f = in;
390 		}
391 		public Boolean toBoolean() {
392 			return f;
393 		}
394 	}
395 
396 	public static class E2 {
397 		private Boolean[] f;
398 		public E2(Boolean...in) {
399 			this.f = in;
400 		}
401 		public Boolean[] toBooleanArray() {
402 			return f;
403 		}
404 	}
405 
406 	@Test void e01_booleanType() throws Exception {
407 		var ps = T_BOOLEAN;
408 		assertEquals("true", serialize(ps, true));
409 		assertEquals("true", serialize(ps, "true"));
410 		assertEquals("true", serialize(ps, new E1(true)));
411 		assertEquals("false", serialize(ps, false));
412 		assertEquals("false", serialize(ps, "false"));
413 		assertEquals("false", serialize(ps, new E1(false)));
414 		assertEquals("null", serialize(ps, null));
415 		assertEquals("null", serialize(ps, "null"));
416 		assertEquals("null", serialize(ps, new E1(null)));
417 	}
418 
419 	@Test void e03_booleanType_2d() throws Exception {
420 		var ps = tArray(tBoolean()).build();
421 		assertEquals("true", serialize(ps, booleans(true)));
422 		assertEquals("true,null", serialize(ps, a(true,null)));
423 		assertEquals("true,null", serialize(ps, l(true,null)));
424 		assertEquals("true,null", serialize(ps, a("true",null)));
425 		assertEquals("true,null", serialize(ps, l("true",null)));
426 		assertEquals("true,null", serialize(ps, ao(true,null)));
427 		assertEquals("true,null", serialize(ps, l(true,null)));
428 		assertEquals("true,null,null", serialize(ps, a(new E1(true),new E1(null),null)));
429 		assertEquals("true,null,null", serialize(ps, l(new E1(true),new E1(null),null)));
430 		assertEquals("true,null", serialize(ps, new E2(true,null)));
431 	}
432 
433 	@Test void e04_booleanType_3d() throws Exception {
434 		var ps = tArrayPipes(tArray(tBoolean())).build();
435 		assertEquals("true,true|false", serialize(ps, new boolean[][]{{true,true},{false}}));
436 		assertEquals("true,true|false", serialize(ps, l(booleans(true,true),booleans(false))));
437 		assertEquals("true,true|false,null", serialize(ps, a(a(true,true),a(false,null))));
438 		assertEquals("true,true|false,null", serialize(ps, l(a(true,true),a(false,null))));
439 		assertEquals("true,true|false,null", serialize(ps, l(l(true,true),l(false,null))));
440 		assertEquals("true,true|false,null,null", serialize(ps, l(l("true","true"),l("false","null",null))));
441 		assertEquals("true,true|false,null,null", serialize(ps, l(a("true","true"),a("false","null",null))));
442 		assertEquals("true,true|false,null", serialize(ps, a2(ao(true,true),ao(false,null))));
443 		assertEquals("true,true|false,null", serialize(ps, l(l((Object)true,(Object)true),l((Object)false,null))));
444 		assertEquals("true,true|false,null", serialize(ps, l(ao(true,true),ao(false,null))));
445 		assertEquals("true,true|false,null", serialize(ps, a(a(new E1(true),new E1(true)),a(new E1(false),new E1(null)))));
446 		assertEquals("true,true|false,null", serialize(ps, l(l(new E1(true),new E1(true)), l(new E1(false),new E1(null)))));
447 		assertEquals("true,true|false,null", serialize(ps, l(a(new E1(true),new E1(true)),a(new E1(false),new E1(null)))));
448 		assertEquals("true,true|false,null", serialize(ps, a(new E2(true,true),new E2(false,null))));
449 		assertEquals("true,true|false,null", serialize(ps, l(new E2(true,true),new E2(false,null))));
450 	}
451 
452 	//-----------------------------------------------------------------------------------------------------------------
453 	// type = integer
454 	//-----------------------------------------------------------------------------------------------------------------
455 
456 	public static class F1 {
457 		private Integer f;
458 		public F1(Integer in) {
459 			this.f = in;
460 		}
461 		public Integer toInteger() {
462 			return f;
463 		}
464 	}
465 
466 	public static class F2 {
467 		private Integer[] f;
468 		public F2(Integer...in) {
469 			this.f = in;
470 		}
471 		public Integer[] toIntegerArray() {
472 			return f;
473 		}
474 	}
475 
476 	public static class F3 {
477 		private Long f;
478 		public F3(Long in) {
479 			this.f = in;
480 		}
481 		public Long toLong() {
482 			return f;
483 		}
484 	}
485 
486 	public static class F4 {
487 		private Long[] f;
488 		public F4(Long...in) {
489 			this.f = in;
490 		}
491 		public Long[] toLongArray() {
492 			return f;
493 		}
494 	}
495 
496 	@Test void f01_integerType_int32() throws Exception {
497 		var ps = T_INT32;
498 		assertEquals("1", serialize(ps, 1));
499 		assertEquals("1", serialize(ps, Integer.valueOf(1)));
500 		assertEquals("1", serialize(ps, (short)1));
501 		assertEquals("1", serialize(ps, Short.valueOf((short)1)));
502 		assertEquals("1", serialize(ps, 1L));
503 		assertEquals("1", serialize(ps, Long.valueOf(1)));
504 		assertEquals("1", serialize(ps, "1"));
505 		assertEquals("1", serialize(ps, new F1(1)));
506 		assertEquals("null", serialize(ps, null));
507 		assertEquals("null", serialize(ps, "null"));
508 	}
509 
510 	@Test void f02_integerType_int32_2d() throws Exception {
511 		var ps = tArray(tInt32()).build();
512 		assertEquals("1,2", serialize(ps, ints(1,2)));
513 		assertEquals("1,2,null", serialize(ps, a(1,2,null)));
514 		assertEquals("1,2,null", serialize(ps, l(1,2,null)));
515 		assertEquals("1,2", serialize(ps, shorts(1,2)));
516 		assertEquals("1,2,null", serialize(ps, a((short)1,(short)2,null)));
517 		assertEquals("1,2,null", serialize(ps, l(Short.valueOf((short)1),Short.valueOf((short)2),null)));
518 		assertEquals("1,2", serialize(ps, longs(1L,2L)));
519 		assertEquals("1,2,null", serialize(ps, a(1L,2L,null)));
520 		assertEquals("1,2,null", serialize(ps, l(1L,2L,null)));
521 		assertEquals("1,2,null,null", serialize(ps, a("1","2","null",null)));
522 		assertEquals("1,2,null,null", serialize(ps, l("1","2","null",null)));
523 		assertEquals("1,2,null", serialize(ps, ao(1,2,null)));
524 		assertEquals("1,2,null", serialize(ps, l(1,2,null)));
525 		assertEquals("1,2,null,null", serialize(ps, a(new F1(1),new F1(2),new F1(null),null)));
526 		assertEquals("1,2,null,null", serialize(ps, l(new F1(1),new F1(2),new F1(null),null)));
527 		assertEquals("1,2,null", serialize(ps, new F2(1,2,null)));
528 	}
529 
530 	@Test void f03_integerType_int32_3d() throws Exception {
531 		var ps = tArrayPipes(tArray(tInt32())).build();
532 		assertEquals("1,2|3|null", serialize(ps, new int[][]{{1,2},{3},null}));
533 		assertEquals("1,2|3|null", serialize(ps, l(ints(1,2),ints(3),null)));
534 		assertEquals("1,2|3,null|null", serialize(ps, a(a(1,2),a(3,null),null)));
535 		assertEquals("1,2|3,null|null", serialize(ps, l(a(1,2),a(3,null),null)));
536 		assertEquals("1,2|3,null|null", serialize(ps, l(l(1,2),l(3,null),null)));
537 		assertEquals("1,2|3|null", serialize(ps, new short[][]{{1,2},{3},null}));
538 		assertEquals("1,2|3|null", serialize(ps, l(shorts(1,2),shorts(3),null)));
539 		assertEquals("1,2|3,null|null", serialize(ps, a(a((short)1,(short)2),a((short)3,null),null)));
540 		assertEquals("1,2|3,null|null", serialize(ps, l(a((short)1,(short)2),a((short)3,null),null)));
541 		assertEquals("1,2|3,null|null", serialize(ps, l(l(Short.valueOf((short)1),Short.valueOf((short)2)),l(Short.valueOf((short)3),null),null)));
542 		assertEquals("1,2|3|null", serialize(ps, new long[][]{{1L,2L},{3L},null}));
543 		assertEquals("1,2|3|null", serialize(ps, l(longs(1L,2L),longs(3L),null)));
544 		assertEquals("1,2|3,null|null", serialize(ps, a(a(1L,2L),a(3L,null),null)));
545 		assertEquals("1,2|3,null|null", serialize(ps, l(a(1L,2L),a(3L,null),null)));
546 		assertEquals("1,2|3,null|null", serialize(ps, l(l(Long.valueOf(1),Long.valueOf(2)),l(Long.valueOf(3),null),null)));
547 		assertEquals("1,2|3,null,null|null", serialize(ps, a2(a("1","2"),a("3","null",null),null)));
548 		assertEquals("1,2|3,null,null|null", serialize(ps, l(a("1","2"),a("3","null",null),null)));
549 		assertEquals("1,2|3,null,null|null", serialize(ps, l(l("1","2"),l("3","null",null),null)));
550 		assertEquals("1,2|3,null|null", serialize(ps, a2(ao(1,2),ao(3,null),null)));
551 		assertEquals("1,2|3,null|null", serialize(ps, l(ao(1,2),ao(3,null),null)));
552 		assertEquals("1,2|3,null|null", serialize(ps, l(l(1,2),l(3,null),null)));
553 		assertEquals("1,2|3,null,null|null", serialize(ps, a(a(new F1(1),new F1(2)),a(new F1(3),new F1(null),null),null)));
554 		assertEquals("1,2|3,null,null|null", serialize(ps, l(a(new F1(1),new F1(2)),a(new F1(3),new F1(null),null),null)));
555 		assertEquals("1,2|3,null,null|null", serialize(ps, l(l(new F1(1),new F1(2)),l(new F1(3),new F1(null),null),null)));
556 		assertEquals("1,2|3,null|null", serialize(ps, a(new F2(1,2),new F2(3,null),null)));
557 		assertEquals("1,2|3,null|null", serialize(ps, l(new F2(1,2),new F2(3,null),null)));
558 	}
559 
560 	@Test void f04_integerType_int64() throws Exception {
561 		var ps = T_INT64;
562 		assertEquals("1", serialize(ps, 1));
563 		assertEquals("1", serialize(ps, Integer.valueOf(1)));
564 		assertEquals("1", serialize(ps, (short)1));
565 		assertEquals("1", serialize(ps, Short.valueOf((short)1)));
566 		assertEquals("1", serialize(ps, 1L));
567 		assertEquals("1", serialize(ps, Long.valueOf(1L)));
568 		assertEquals("1", serialize(ps, "1"));
569 		assertEquals("1", serialize(ps,  new F3(1L)));
570 		assertEquals("null", serialize(ps, null));
571 		assertEquals("null", serialize(ps, "null"));
572 	}
573 
574 	@Test void f05_integerType_int64_2d() throws Exception {
575 		var ps = tArray(tInt64()).build();
576 		assertEquals("1,2", serialize(ps, ints(1,2)));
577 		assertEquals("1,2,null", serialize(ps, a(1,2,null)));
578 		assertEquals("1,2,null", serialize(ps, l(1,2,null)));
579 		assertEquals("1,2", serialize(ps, shorts(1,2)));
580 		assertEquals("1,2,null", serialize(ps, a((short)1,(short)2,null)));
581 		assertEquals("1,2,null", serialize(ps, l((short)1,(short)2,null)));
582 		assertEquals("1,2", serialize(ps, longs(1L,2L)));
583 		assertEquals("1,2,null", serialize(ps, a(1L,2L,null)));
584 		assertEquals("1,2,null", serialize(ps, l(1L,2L,null)));
585 		assertEquals("1,2,null,null", serialize(ps, a("1","2","null",null)));
586 		assertEquals("1,2,null,null", serialize(ps, l("1","2","null",null)));
587 		assertEquals("1,2,null", serialize(ps, ao(1,2,null)));
588 		assertEquals("1,2,null", serialize(ps, l((Object)1,(Object)2,null)));
589 		assertEquals("1,2,null,null", serialize(ps, a(new F3(1L),new F3(2L),new F3(null),null)));
590 		assertEquals("1,2,null,null", serialize(ps, l(new F3(1L),new F3(2L),new F3(null),null)));
591 		assertEquals("1,2,null", serialize(ps, new F4(1L,2L,null)));
592 	}
593 
594 	@Test void f06_integerType_int64_3d() throws Exception {
595 		var ps = tArrayPipes(tArray(tInt64())).build();
596 		assertEquals("1,2|3|null", serialize(ps, new int[][]{{1,2},{3},null}));
597 		assertEquals("1,2|3|null", serialize(ps, l(ints(1,2),ints(3),null)));
598 		assertEquals("1,2|3,null|null", serialize(ps, a(a(1,2),a(3,null),null)));
599 		assertEquals("1,2|3,null|null", serialize(ps, l(a(1,2),a(3,null),null)));
600 		assertEquals("1,2|3,null|null", serialize(ps, l(l(1,2),l(3,null),null)));
601 		assertEquals("1,2|3|null", serialize(ps, new short[][]{{1,2},{3},null}));
602 		assertEquals("1,2|3|null", serialize(ps, l(shorts(1,2),shorts(3),null)));
603 		assertEquals("1,2|3,null|null", serialize(ps, a(a((short)1,(short)2),a((short)3,null),null)));
604 		assertEquals("1,2|3,null|null", serialize(ps, l(a((short)1,(short)2),a((short)3,null),null)));
605 		assertEquals("1,2|3,null|null", serialize(ps, l(l((short)1,(short)2),l((short)3,null),null)));
606 		assertEquals("1,2|3|null", serialize(ps, new long[][]{{1L,2L},{3L},null}));
607 		assertEquals("1,2|3|null", serialize(ps, l(longs(1L,2L),longs(3L),null)));
608 		assertEquals("1,2|3,null|null", serialize(ps, a(a(1L,2L),a(3L,null),null)));
609 		assertEquals("1,2|3,null|null", serialize(ps, l(a(1L,2L),a(3L,null),null)));
610 		assertEquals("1,2|3,null|null", serialize(ps, l(l(1L,2L),l(3L,null),null)));
611 		assertEquals("1,2|3,null,null|null", serialize(ps, a2(a("1","2"),a("3","null",null),null)));
612 		assertEquals("1,2|3,null,null|null", serialize(ps, l(a("1","2"),a("3","null",null),null)));
613 		assertEquals("1,2|3,null,null|null", serialize(ps, l(l("1","2"),l("3","null",null),null)));
614 		assertEquals("1,2|3,null|null", serialize(ps, a2(ao(1,2),ao(3,null),null)));
615 		assertEquals("1,2|3,null|null", serialize(ps, l(ao(1,2),ao(3,null),null)));
616 		assertEquals("1,2|3,null|null", serialize(ps, l(l((Object)1,(Object)2),l((Object)3,null),null)));
617 		assertEquals("1,2|3,null,null|null", serialize(ps, a(a(new F3(1L),new F3(2L)),a(new F3(3L),new F3(null),null),null)));
618 		assertEquals("1,2|3,null,null|null", serialize(ps, l(a(new F3(1L),new F3(2L)),a(new F3(3L),new F3(null),null),null)));
619 		assertEquals("1,2|3,null,null|null", serialize(ps, l(l(new F3(1L),new F3(2L)),l(new F3(3L),new F3(null),null),null)));
620 		assertEquals("1,2|3,null|null", serialize(ps, a(new F4(1L,2L),new F4(3L,null),null)));
621 		assertEquals("1,2|3,null|null", serialize(ps, l(new F4(1L,2L),new F4(3L,null),null)));
622 	}
623 
624 	//-----------------------------------------------------------------------------------------------------------------
625 	// type = number
626 	//-----------------------------------------------------------------------------------------------------------------
627 
628 	public static class G1 {
629 		private Float f;
630 		public G1(Float in) {
631 			this.f = in;
632 		}
633 		public Float toFloat() {
634 			return f;
635 		}
636 	}
637 
638 	public static class G2 {
639 		private Float[] f;
640 		public G2(Float...in) {
641 			this.f = in;
642 		}
643 		public Float[] toFloatArray() {
644 			return f;
645 		}
646 	}
647 
648 	public static class G3 {
649 		private Double f;
650 		public G3(Double in) {
651 			this.f = in;
652 		}
653 		public Double toDouble() {
654 			return f;
655 		}
656 	}
657 
658 	public static class G4 {
659 		private Double[] f;
660 		public G4(Double...in) {
661 			this.f = in;
662 		}
663 		public Double[] toDoubleArray() {
664 			return f;
665 		}
666 	}
667 
668 	@Test void g01_numberType_float() throws Exception {
669 		var ps = T_FLOAT;
670 		assertEquals("1.0", serialize(ps, 1f));
671 		assertEquals("1.0", serialize(ps, Float.valueOf(1f)));
672 		assertEquals("1.0", serialize(ps, 1d));
673 		assertEquals("1.0", serialize(ps, Double.valueOf(1d)));
674 		assertEquals("1.0", serialize(ps, "1"));
675 		assertEquals("1.0", serialize(ps, new G1(1f)));
676 		assertEquals("null", serialize(ps, null));
677 		assertEquals("null", serialize(ps, "null"));
678 		assertEquals("null", serialize(ps, new G1(null)));
679 	}
680 
681 	@Test void g02_numberType_float_2d() throws Exception {
682 		var ps = tArray(tFloat()).build();
683 		assertEquals("1.0,2.0", serialize(ps, floats(1,2)));
684 		assertEquals("1.0,2.0,null", serialize(ps, a(1f,2f,null)));
685 		assertEquals("1.0,2.0,null", serialize(ps, l(1f,2f,null)));
686 		assertEquals("1.0,2.0", serialize(ps, doubles(1,2)));
687 		assertEquals("1.0,2.0,null", serialize(ps, a(1d,2d,null)));
688 		assertEquals("1.0,2.0,null", serialize(ps, l(1d,2d,null)));
689 		assertEquals("1.0,2.0,null,null", serialize(ps, a("1","2","null",null)));
690 		assertEquals("1.0,2.0,null,null", serialize(ps, l("1","2","null",null)));
691 		assertEquals("1.0,2.0,null", serialize(ps, ao(1,2,null)));
692 		assertEquals("1.0,2.0,null", serialize(ps, l((Object)1,(Object)2,null)));
693 		assertEquals("1.0,2.0,null,null", serialize(ps, a(new G1(1f),new G1(2f),new G1(null),null)));
694 		assertEquals("1.0,2.0,null,null", serialize(ps, l(new G1(1f),new G1(2f),new G1(null),null)));
695 		assertEquals("1.0,2.0,null", serialize(ps, new G2(1f,2f,null)));
696 	}
697 
698 	@Test void g03_numberType_float_3d() throws Exception {
699 		var ps = tArrayPipes(tArray(tFloat())).build();
700 		assertEquals("1.0,2.0|3.0|null", serialize(ps, a(a(1f,2f),a(3f),null)));
701 		assertEquals("1.0,2.0|3.0|null", serialize(ps, l(floats(1,2),floats(3),null)));
702 		assertEquals("1.0,2.0|3.0,null|null", serialize(ps, a(a(1f,2f),a(3f,null),null)));
703 		assertEquals("1.0,2.0|3.0,null|null", serialize(ps, l(a(1f,2f),a(3f,null),null)));
704 		assertEquals("1.0,2.0|3.0,null|null", serialize(ps, l(l(1f,2f),l(3f,null),null)));
705 		assertEquals("1.0,2.0|3.0|null", serialize(ps, a(a(1d,2d),a(3d),null)));
706 		assertEquals("1.0,2.0|3.0|null", serialize(ps, l(doubles(1d,2d),doubles(3d),null)));
707 		assertEquals("1.0,2.0|3.0,null|null", serialize(ps, a(a(1d,2d),a(3d,null),null)));
708 		assertEquals("1.0,2.0|3.0,null|null", serialize(ps, l(a(1d,2d),a(3d,null),null)));
709 		assertEquals("1.0,2.0|3.0,null|null", serialize(ps, l(l(1d,2d),l(3d,null),null)));
710 		assertEquals("1.0,2.0|3.0,null,null|null", serialize(ps, a2(a("1","2"),a("3","null",null),null)));
711 		assertEquals("1.0,2.0|3.0,null,null|null", serialize(ps, l(a("1","2"),a("3","null",null),null)));
712 		assertEquals("1.0,2.0|3.0,null,null|null", serialize(ps, l(l(1d,2d),l(3f,"null",null),null)));
713 		assertEquals("1.0,2.0|3.0,null,null|null", serialize(ps, a2(ao(1d,2d),ao(3f,"null",null),null)));
714 		assertEquals("1.0,2.0|3.0,null,null|null", serialize(ps, l(ao(1d,2d),ao(3f,"null",null),null)));
715 		assertEquals("1.0,2.0|3.0,null,null|null", serialize(ps, l(l(1d,2d),l(3f,"null",null),null)));
716 		assertEquals("1.0,2.0|3.0,null,null|null", serialize(ps, a(a(new G1(1f),new G1(2f)),a(new G1(3f),new G1(null),null),null)));
717 		assertEquals("1.0,2.0|3.0,null,null|null", serialize(ps, l(a(new G1(1f),new G1(2f)),a(new G1(3f),new G1(null),null),null)));
718 		assertEquals("1.0,2.0|3.0,null,null|null", serialize(ps, l(l(new G1(1f),new G1(2f)),l(new G1(3f),new G1(null),null),null)));
719 		assertEquals("1.0,2.0,null|null", serialize(ps, a(new G2(1f,2f,null),null)));
720 		assertEquals("1.0,2.0,null|null", serialize(ps, l(new G2(1f,2f,null),null)));
721 	}
722 
723 	@Test void g04_numberType_double() throws Exception {
724 		var ps = T_DOUBLE;
725 		assertEquals("1.0", serialize(ps, 1f));
726 		assertEquals("1.0", serialize(ps, Float.valueOf(1f)));
727 		assertEquals("1.0", serialize(ps, 1d));
728 		assertEquals("1.0", serialize(ps, Double.valueOf(1d)));
729 		assertEquals("1.0", serialize(ps, "1"));
730 		assertEquals("1.0", serialize(ps, new G3(1d)));
731 		assertEquals("null", serialize(ps, null));
732 		assertEquals("null", serialize(ps, "null"));
733 		assertEquals("null", serialize(ps, new G3(null)));
734 	}
735 
736 	@Test void g05_numberType_double_2d() throws Exception {
737 		var ps = tArray(tDouble()).build();
738 		assertEquals("1.0,2.0", serialize(ps, floats(1,2)));
739 		assertEquals("1.0,2.0,null", serialize(ps, a(1f,2f,null)));
740 		assertEquals("1.0,2.0,null", serialize(ps, l(1f,2f,null)));
741 		assertEquals("1.0,2.0", serialize(ps, doubles(1,2)));
742 		assertEquals("1.0,2.0,null", serialize(ps, a(1d,2d,null)));
743 		assertEquals("1.0,2.0,null", serialize(ps, l(1d,2d,null)));
744 		assertEquals("1.0,2.0,null,null", serialize(ps, a("1","2","null",null)));
745 		assertEquals("1.0,2.0,null,null", serialize(ps, l("1","2","null",null)));
746 		assertEquals("1.0,2.0,null,null", serialize(ps, ao(1d,2f,"null",null)));
747 		assertEquals("1.0,2.0,null,null", serialize(ps, l(1d,2f,"null",null)));
748 		assertEquals("1.0,2.0,null,null", serialize(ps, a(new G3(1d),new G3(2d),new G3(null),null)));
749 		assertEquals("1.0,2.0,null,null", serialize(ps, l(new G3(1d),new G3(2d),new G3(null),null)));
750 		assertEquals("1.0,2.0,null", serialize(ps, new G4(1d,2d,null)));
751 	}
752 
753 	@Test void g06_numberType_double_3d() throws Exception {
754 		var ps = tArrayPipes(tArray(tDouble())).build();
755 		assertEquals("1.0,2.0|3.0|null", serialize(ps, a(a(1f,2f),a(3f),null)));
756 		assertEquals("1.0,2.0|3.0|null", serialize(ps, l(floats(1f,2f),floats(3f),null)));
757 		assertEquals("1.0,2.0|3.0,null|null", serialize(ps, a(a(1f,2f),a(3f,null),null)));
758 		assertEquals("1.0,2.0|3.0,null|null", serialize(ps, l(a(1f,2f),a(3f,null),null)));
759 		assertEquals("1.0,2.0|3.0,null|null", serialize(ps, l(l(1f,2f),l(3f,null),null)));
760 		assertEquals("1.0,2.0|3.0|null", serialize(ps, a(a(1d,2d),a(3d),null)));
761 		assertEquals("1.0,2.0|3.0|null", serialize(ps, l(doubles(1d,2d),doubles(3d),null)));
762 		assertEquals("1.0,2.0|3.0,null|null", serialize(ps, a(a(1d,2d),a(3d,null),null)));
763 		assertEquals("1.0,2.0|3.0,null|null", serialize(ps, l(a(1d,2d),a(3d,null),null)));
764 		assertEquals("1.0,2.0|3.0,null|null", serialize(ps, l(l(1d,2d),l(3d,null),null)));
765 		assertEquals("1.0,2.0|3.0,null,null|null", serialize(ps, a2(a("1","2"),a("3","null",null),null)));
766 		assertEquals("1.0,2.0|3.0,null,null|null", serialize(ps, l(a("1","2"),a("3","null",null),null)));
767 		assertEquals("1.0,2.0|3.0,null,null|null", serialize(ps, l(l("1","2"),l("3","null",null),null)));
768 		assertEquals("1.0,2.0|3.0,null,null|null", serialize(ps, a2(ao(1d,2d),ao("3","null",null),null)));
769 		assertEquals("1.0,2.0|3.0,null,null|null", serialize(ps, l(ao(1d,2d),ao("3","null",null),null)));
770 		assertEquals("1.0,2.0|3.0,null,null|null", serialize(ps, l(l(1d,2f),l(3d,"null",null),null)));
771 		assertEquals("1.0,2.0|3.0,null,null|null", serialize(ps, a(a(new G3(1d),new G3(2d)),a(new G3(3d),new G3(null),null),null)));
772 		assertEquals("1.0,2.0|3.0,null,null|null", serialize(ps, l(a(new G3(1d),new G3(2d)),a(new G3(3d),new G3(null),null),null)));
773 		assertEquals("1.0,2.0|3.0,null,null|null", serialize(ps, l(l(new G3(1d),new G3(2d)),l(new G3(3d),new G3(null),null),null)));
774 		assertEquals("1.0,2.0|3.0,null|null", serialize(ps, a(new G4(1d,2d),new G4(3d,null),null)));
775 		assertEquals("1.0,2.0|3.0,null|null", serialize(ps, l(new G4(1d,2d),new G4(3d,null),null)));
776 	}
777 
778 	//-----------------------------------------------------------------------------------------------------------------
779 	// type = object
780 	//-----------------------------------------------------------------------------------------------------------------
781 
782 	public static class H1 {
783 		public String f1;
784 		public Integer f2;
785 		public Boolean f3;
786 		public H1(String f1, Integer f2, Boolean f3) {
787 			this.f1 = f1;
788 			this.f2 = f2;
789 			this.f3 = f3;
790 		}
791 	}
792 
793 	@Test void h01_objectType() throws Exception {
794 		var ps = tObject().allowEmptyValue().build();
795 		assertEquals("f1=1,f2=2,f3=true", serialize(ps, new H1("1",2,true)));
796 		assertEquals("", serialize(ps, new H1(null,null,null)));
797 		assertEquals("f1=1,f2=2,f3=true", serialize(ps, JsonMap.ofJson("{f1:'1',f2:2,f3:true}")));
798 		assertEquals("f1=null,f2=null,f3=null", serialize(ps, JsonMap.ofJson("{f1:null,f2:null,f3:null}")));
799 		assertEquals("null", serialize(ps, null));
800 	}
801 
802 	@Test void h02_objectType_uon() throws Exception {
803 		var ps = T_OBJECT_UON;
804 		assertEquals("(f1='1',f2=2,f3=true)", serialize(ps, new H1("1",2,true)));
805 		assertEquals("()", serialize(ps, new H1(null,null,null)));
806 		assertEquals("(f1='1',f2=2,f3=true)", serialize(ps, JsonMap.ofJson("{f1:'1',f2:2,f3:true}")));
807 		assertEquals("(f1=null,f2=null,f3=null)", serialize(ps, JsonMap.ofJson("{f1:null,f2:null,f3:null}")));
808 		assertEquals("null", serialize(ps, null));
809 	}
810 
811 	@Test void h03_objectType_2d() throws Exception {
812 		var ps = tArray(tObject().allowEmptyValue()).build();
813 		assertEquals("f1=1\\,f2=2\\,f3=true,,null", serialize(ps, a(new H1("1",2,true),new H1(null,null,null),null)));
814 		assertEquals("f1=1\\,f2=2\\,f3=true,,null", serialize(ps, l(new H1("1",2,true),new H1(null,null,null),null)));
815 		assertEquals("f1=1\\,f2=2\\,f3=true,f1=null\\,f2=null\\,f3=null,null", serialize(ps, a(JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null)));
816 		assertEquals("f1=1\\,f2=2\\,f3=true,f1=null\\,f2=null\\,f3=null,null", serialize(ps, l(JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null)));
817 		assertEquals("f1=1\\,f2=2\\,f3=true,f1=1\\,f2=2\\,f3=true,null", serialize(ps, ao(new H1("1",2,true),JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),null)));
818 		assertEquals("f1=1\\,f2=2\\,f3=true,f1=1\\,f2=2\\,f3=true,null", serialize(ps, l(new H1("1",2,true),JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),null)));
819 	}
820 
821 	@Test void h03_objectType_2d_pipes() throws Exception {
822 		var ps = tArrayPipes(tObject().allowEmptyValue()).build();
823 		assertEquals("f1=1,f2=2,f3=true||null", serialize(ps, a(new H1("1",2,true),new H1(null,null,null),null)));
824 		assertEquals("f1=1,f2=2,f3=true||null", serialize(ps, l(new H1("1",2,true),new H1(null,null,null),null)));
825 		assertEquals("f1=1,f2=2,f3=true|f1=null,f2=null,f3=null|null", serialize(ps, a(JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null)));
826 		assertEquals("f1=1,f2=2,f3=true|f1=null,f2=null,f3=null|null", serialize(ps, l(JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null)));
827 		assertEquals("f1=1,f2=2,f3=true|f1=1,f2=2,f3=true|null", serialize(ps, ao(new H1("1",2,true),JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),null)));
828 		assertEquals("f1=1,f2=2,f3=true|f1=1,f2=2,f3=true|null", serialize(ps, l(new H1("1",2,true),JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),null)));
829 	}
830 
831 	@Test void h04_objectType_2d_uon() throws Exception {
832 		var ps = tArrayUon(tObject()).build();
833 		assertEquals("@((f1='1',f2=2,f3=true),(),null)", serialize(ps, a(new H1("1",2,true),new H1(null,null,null),null)));
834 		assertEquals("@((f1='1',f2=2,f3=true),(),null)", serialize(ps, l(new H1("1",2,true),new H1(null,null,null),null)));
835 		assertEquals("@((f1='1',f2=2,f3=true),(f1=null,f2=null,f3=null),null)", serialize(ps, a(JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null)));
836 		assertEquals("@((f1='1',f2=2,f3=true),(f1=null,f2=null,f3=null),null)", serialize(ps, l(JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null)));
837 		assertEquals("@((f1='1',f2=2,f3=true),(f1='1',f2=2,f3=true),null)", serialize(ps, ao(new H1("1",2,true),JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),null)));
838 		assertEquals("@((f1='1',f2=2,f3=true),(f1='1',f2=2,f3=true),null)", serialize(ps, l(new H1("1",2,true),JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),null)));
839 	}
840 
841 	@Test void h03_objectType_3d() throws Exception {
842 		var ps = tArray(tArray(tObject().allowEmptyValue())).build();
843 		assertEquals("f1=1\\\\\\,f2=2\\\\\\,f3=true\\,f1=x\\\\\\,f2=3\\\\\\,f3=false,\\,null,null", serialize(ps, a(a(new H1("1",2,true),new H1("x",3,false)),a(new H1(null,null,null),null),null)));
844 		assertEquals("f1=1\\\\\\,f2=2\\\\\\,f3=true\\,f1=x\\\\\\,f2=3\\\\\\,f3=false,\\,null,null", serialize(ps, l(a(new H1("1",2,true),new H1("x",3,false)),a(new H1(null,null,null),null),null)));
845 		assertEquals("f1=1\\\\\\,f2=2\\\\\\,f3=true\\,f1=x\\\\\\,f2=3\\\\\\,f3=false,\\,null,null", serialize(ps, l(l(new H1("1",2,true),new H1("x",3,false)),l(new H1(null,null,null),null),null)));
846 		assertEquals("f1=1\\\\\\,f2=2\\\\\\,f3=true\\,f1=x\\\\\\,f2=4\\\\\\,f3=false,f1=null\\\\\\,f2=null\\\\\\,f3=null\\,null,null", serialize(ps, a(a(JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),JsonMap.ofJson("{f1:'x',f2:4,f3:false}")),a(JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null),null)));
847 		assertEquals("f1=1\\\\\\,f2=2\\\\\\,f3=true\\,f1=x\\\\\\,f2=4\\\\\\,f3=false,f1=null\\\\\\,f2=null\\\\\\,f3=null\\,null,null", serialize(ps, l(a(JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),JsonMap.ofJson("{f1:'x',f2:4,f3:false}")),a(JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null),null)));
848 		assertEquals("f1=1\\\\\\,f2=2\\\\\\,f3=true\\,f1=x\\\\\\,f2=4\\\\\\,f3=false,f1=null\\\\\\,f2=null\\\\\\,f3=null\\,null,null", serialize(ps, l(l(JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),JsonMap.ofJson("{f1:'x',f2:4,f3:false}")),l(JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null),null)));
849 		assertEquals("f1=1\\\\\\,f2=2\\\\\\,f3=true\\,f1=1\\\\\\,f2=2\\\\\\,f3=true,\\,f1=null\\\\\\,f2=null\\\\\\,f3=null\\,null,null", serialize(ps, a2(ao(new H1("1",2,true),JsonMap.ofJson("{f1:'1',f2:2,f3:true}")),ao(new H1(null,null,null),JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null),null)));
850 		assertEquals("f1=1\\\\\\,f2=2\\\\\\,f3=true\\,f1=1\\\\\\,f2=2\\\\\\,f3=true,\\,f1=null\\\\\\,f2=null\\\\\\,f3=null\\,null,null", serialize(ps, l(ao(new H1("1",2,true),JsonMap.ofJson("{f1:'1',f2:2,f3:true}")),ao(new H1(null,null,null),JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null),null)));
851 		assertEquals("f1=1\\\\\\,f2=2\\\\\\,f3=true\\,f1=1\\\\\\,f2=2\\\\\\,f3=true,\\,f1=null\\\\\\,f2=null\\\\\\,f3=null\\,null,null", serialize(ps, l(l(new H1("1",2,true),JsonMap.ofJson("{f1:'1',f2:2,f3:true}")),l(new H1(null,null,null),JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null),null)));
852 	}
853 
854 	@Test void h03_objectType_3d_ssvAndPipes() throws Exception {
855 		var ps = tArraySsv(tArrayPipes(tObject().allowEmptyValue())).build();
856 		assertEquals("null|null null|null null null", serialize(ps, a2(a(null,null),a(null,null),null,null)));
857 //f1=1,f2=2,f3=true|f1=x,f2=3,f3=false null null
858 		assertEquals("f1=1,f2=2,f3=true|f1=x,f2=3,f3=false |null null", serialize(ps, a(a(new H1("1",2,true),new H1("x",3,false)),a(new H1(null,null,null),null),null)));
859 		assertEquals("f1=1,f2=2,f3=true|f1=x,f2=3,f3=false |null null", serialize(ps, l(a(new H1("1",2,true),new H1("x",3,false)),a(new H1(null,null,null),null),null)));
860 		assertEquals("f1=1,f2=2,f3=true|f1=x,f2=3,f3=false |null null", serialize(ps, l(l(new H1("1",2,true),new H1("x",3,false)),l(new H1(null,null,null),null),null)));
861 		assertEquals("f1=1,f2=2,f3=true|f1=x,f2=4,f3=false f1=null,f2=null,f3=null|null null", serialize(ps, a(a(JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),JsonMap.ofJson("{f1:'x',f2:4,f3:false}")),a(JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null),null)));
862 		assertEquals("f1=1,f2=2,f3=true|f1=x,f2=4,f3=false f1=null,f2=null,f3=null|null null", serialize(ps, l(a(JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),JsonMap.ofJson("{f1:'x',f2:4,f3:false}")),a(JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null),null)));
863 		assertEquals("f1=1,f2=2,f3=true|f1=x,f2=4,f3=false f1=null,f2=null,f3=null|null null", serialize(ps, l(l(JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),JsonMap.ofJson("{f1:'x',f2:4,f3:false}")),l(JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null),null)));
864 		assertEquals("f1=1,f2=2,f3=true|f1=1,f2=2,f3=true |f1=null,f2=null,f3=null|null null", serialize(ps, a2(ao(new H1("1",2,true),JsonMap.ofJson("{f1:'1',f2:2,f3:true}")),ao(new H1(null,null,null),JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null),null)));
865 		assertEquals("f1=1,f2=2,f3=true|f1=1,f2=2,f3=true |f1=null,f2=null,f3=null|null null", serialize(ps, l(ao(new H1("1",2,true),JsonMap.ofJson("{f1:'1',f2:2,f3:true}")),ao(new H1(null,null,null),JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null),null)));
866 		assertEquals("f1=1,f2=2,f3=true|f1=1,f2=2,f3=true |f1=null,f2=null,f3=null|null null", serialize(ps, l(l(new H1("1",2,true),JsonMap.ofJson("{f1:'1',f2:2,f3:true}")),l(new H1(null,null,null),JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null),null)));
867 	}
868 
869 	@Test void h03_objectType_3d_uon() throws Exception {
870 		var ps = tArrayUon(tArray(tObject())).build();
871 		assertEquals("@(@((f1='1',f2=2,f3=true),(f1=x,f2=3,f3=false)),@((),null),null)", serialize(ps, a(a(new H1("1",2,true),new H1("x",3,false)),a(new H1(null,null,null),null),null)));
872 		assertEquals("@(@((f1='1',f2=2,f3=true),(f1=x,f2=3,f3=false)),@((),null),null)", serialize(ps, l(a(new H1("1",2,true),new H1("x",3,false)),a(new H1(null,null,null),null),null)));
873 		assertEquals("@(@((f1='1',f2=2,f3=true),(f1=x,f2=3,f3=false)),@((),null),null)", serialize(ps, l(l(new H1("1",2,true),new H1("x",3,false)),l(new H1(null,null,null),null),null)));
874 		assertEquals("@(@((f1='1',f2=2,f3=true),(f1=x,f2=4,f3=false)),@((f1=null,f2=null,f3=null),null),null)", serialize(ps, a(a(JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),JsonMap.ofJson("{f1:'x',f2:4,f3:false}")),a(JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null),null)));
875 		assertEquals("@(@((f1='1',f2=2,f3=true),(f1=x,f2=4,f3=false)),@((f1=null,f2=null,f3=null),null),null)", serialize(ps, l(a(JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),JsonMap.ofJson("{f1:'x',f2:4,f3:false}")),a(JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null),null)));
876 		assertEquals("@(@((f1='1',f2=2,f3=true),(f1=x,f2=4,f3=false)),@((f1=null,f2=null,f3=null),null),null)", serialize(ps, l(l(JsonMap.ofJson("{f1:'1',f2:2,f3:true}"),JsonMap.ofJson("{f1:'x',f2:4,f3:false}")),l(JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null),null)));
877 		assertEquals("@(@((f1='1',f2=2,f3=true),(f1='1',f2=2,f3=true)),@((),(f1=null,f2=null,f3=null),null),null)", serialize(ps, a2(ao(new H1("1",2,true),JsonMap.ofJson("{f1:'1',f2:2,f3:true}")),ao(new H1(null,null,null),JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null),null)));
878 		assertEquals("@(@((f1='1',f2=2,f3=true),(f1='1',f2=2,f3=true)),@((),(f1=null,f2=null,f3=null),null),null)", serialize(ps, l(ao(new H1("1",2,true),JsonMap.ofJson("{f1:'1',f2:2,f3:true}")),ao(new H1(null,null,null),JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null),null)));
879 		assertEquals("@(@((f1='1',f2=2,f3=true),(f1='1',f2=2,f3=true)),@((),(f1=null,f2=null,f3=null),null),null)", serialize(ps, l(l(new H1("1",2,true),JsonMap.ofJson("{f1:'1',f2:2,f3:true}")),l(new H1(null,null,null),JsonMap.ofJson("{f1:null,f2:null,f3:null}"),null),null)));
880 	}
881 
882 	public static class H2 {
883 		public Object f01, f02, f04, f05, f06, f07, f08, f09, f10, f11, f12, f99;
884 		public H2(Object f01, Object f02, Object f04, Object f05, Object f06, Object f07, Object f08, Object f09, Object f10, Object f11, Object f12, Object f99) {
885 			this.f01 = f01;
886 			this.f02 = f02;
887 			this.f04 = f04;
888 			this.f05 = f05;
889 			this.f06 = f06;
890 			this.f07 = f07;
891 			this.f08 = f08;
892 			this.f09 = f09;
893 			this.f10 = f10;
894 			this.f11 = f11;
895 			this.f12 = f12;
896 			this.f99 = f99;
897 		}
898 	}
899 
900 	@Test void h04_objectType_simpleProperties() throws Exception {
901 		var ps = tObject()
902 			.p("f01", tString())
903 			.p("f02", tByte())
904 			.p("f04", tDateTime())
905 			.p("f05", tBinary())
906 			.p("f06", tBinarySpaced())
907 			.p("f07", tUon())
908 			.p("f08", tInteger())
909 			.p("f09", tInt64())
910 			.p("f10", tNumber())
911 			.p("f11", tDouble())
912 			.p("f12", tBoolean())
913 			.ap(tInteger())
914 			.allowEmptyValue()
915 			.build();
916 
917 		var foob = "foo".getBytes();
918 
919 		assertEquals(
920 			"f01=foo,f02=Zm9v,f04=2012-12-21T12:34:56Z,f05=666F6F,f06=66 6F 6F,f07=foo,f08=1,f09=2,f10=1.0,f11=1.0,f12=true,f99=1",
921 			serialize(ps, new H2("foo",foob,opt("2012-12-21T12:34:56Z").filter(x1 -> ! isBlank(x1)).map(x -> GranularZonedDateTime.of("2012-12-21T12:34:56Z").getZonedDateTime()).map(GregorianCalendar::from).orElse(null),foob,foob,"foo",1,2,1.0,1.0,true,1))
922 		);
923 		assertEquals("", serialize(ps, new H2(null,null,null,null,null,null,null,null,null,null,null,null)));
924 		assertEquals("null", serialize(ps, null));
925 		assertEquals(
926 			"f01=foo,f02=Zm9v,f04=2012-12-21T12:34:56Z,f05=666F6F,f06=66 6F 6F,f07=foo,f08=1,f09=2,f10=1.0,f11=1.0,f12=true,f99=1",
927 			serialize(ps, JsonMap.of("f01","foo","f02",foob,"f04",opt("2012-12-21T12:34:56Z").filter(x11 -> ! isBlank(x11)).map(x2 -> GranularZonedDateTime.of("2012-12-21T12:34:56Z").getZonedDateTime()).map(GregorianCalendar::from).orElse(null),"f05",foob,"f06",foob,"f07","foo","f08",1,"f09",2,"f10",1.0,"f11",1.0,"f12",true,"f99",1))
928 		);
929 	}
930 
931 	@Test void h05_objectType_arrayProperties() throws Exception {
932 		var ps = tObjectUon()
933 			.p("f01", tArray(tString()))
934 			.p("f02", tArray(tByte()))
935 			.p("f04", tArray(tDateTime()))
936 			.p("f05", tArray(tBinary()))
937 			.p("f06", tArray(tBinarySpaced()))
938 			.p("f07", tArray(tUon()))
939 			.p("f08", tArray(tInteger()))
940 			.p("f09", tArray(tInt64()))
941 			.p("f10", tArray(tNumber()))
942 			.p("f11", tArray(tDouble()))
943 			.p("f12", tArray(tBoolean()))
944 			.ap(tArray(tInteger()))
945 			.build();
946 
947 		var foob = "foo".getBytes();
948 
949 		assertEquals(
950 			"(f01=@('a,b',null),f02=@(Zm9v,null),f04=@(2012-12-21T12:34:56Z,null),f05=@(666F6F,null),f06=@('66 6F 6F',null),f07=@(a,b,null),f08=@(1,2,null),f09=@(3,4,null),f10=@(1.0,2.0,null),f11=@(3.0,4.0,null),f12=@(true,false,null),f99=@(1,x,null))",
951 			serialize(ps, new H2(a("a,b",null),new byte[][]{foob,null},a(opt("2012-12-21T12:34:56Z").filter(x1 -> ! isBlank(x1)).map(x -> GranularZonedDateTime.of("2012-12-21T12:34:56Z").getZonedDateTime()).map(GregorianCalendar::from).orElse(null),null),new byte[][]{foob,null},new byte[][]{foob,null},a("a","b",null),a(1,2,null),a(3,4,null),a(1f,2f,null),a(3f,4f,null),a(true,false,null),a(1,"x",null)))
952 		);
953 
954 	}
955 
956 	//-----------------------------------------------------------------------------------------------------------------
957 	// No-schema tests
958 	//-----------------------------------------------------------------------------------------------------------------
959 	@Test void i01a_noSchemaTests_Integer() throws Exception {
960 		for (var v : l(Integer.valueOf(1), Integer.MAX_VALUE, Integer.MIN_VALUE))
961 			assertEquals(valueOf(v), serialize((HttpPartSchema)null, v));
962 	}
963 	@Test void i01b_noSchemaTests_IntegerArray() throws Exception {
964 		assertEquals("1,2147483647,-2147483648", serialize((HttpPartSchema)null, a(Integer.valueOf(1), Integer.MAX_VALUE, Integer.MIN_VALUE)));
965 	}
966 
967 	@Test void i02a_noSchemaTests_Short() throws Exception {
968 		for (var v : l(Short.valueOf((short)1), Short.MAX_VALUE, Short.MIN_VALUE))
969 			assertEquals(valueOf(v), serialize((HttpPartSchema)null, v));
970 	}
971 
972 	@Test void i02b_noSchemaTests_ShortArray() throws Exception {
973 		assertEquals("1,32767,-32768,null", serialize((HttpPartSchema)null, a(Short.valueOf((short)1), Short.MAX_VALUE, Short.MIN_VALUE, null)));
974 	}
975 
976 	@Test void i03a_noSchemaTests_Long() throws Exception {
977 		for (var v : l(Long.valueOf(1), Long.MAX_VALUE, Long.MIN_VALUE))
978 			assertEquals(valueOf(v), serialize((HttpPartSchema)null, v));
979 	}
980 
981 	@Test void i03b_noSchemaTests_LongArray() throws Exception {
982 		assertEquals("1,9223372036854775807,-9223372036854775808,null", serialize((HttpPartSchema)null, a(Long.valueOf(1), Long.MAX_VALUE, Long.MIN_VALUE, null)));
983 	}
984 
985 	@Test void i04a_noSchemaTests_Float() throws Exception {
986 		for (var v : l(Float.valueOf(1f), Float.MAX_VALUE, Float.MIN_VALUE))
987 			assertEquals(valueOf(v), serialize((HttpPartSchema)null, v));
988 	}
989 
990 	@Test void i04b_noSchemaTests_FloatArray() throws Exception {
991 		assertEquals("1.0,3.4028235E38,1.4E-45", serialize((HttpPartSchema)null, a(Float.valueOf(1f), Float.MAX_VALUE, Float.MIN_VALUE)));
992 	}
993 
994 	@Test void i05a_noSchemaTests_Double() throws Exception {
995 		for (var v : l(Double.valueOf(1d), Double.MAX_VALUE, Double.MIN_VALUE))
996 			assertEquals(valueOf(v), serialize((HttpPartSchema)null, v));
997 	}
998 
999 	@Test void i05b_noSchemaTests_DoubleArray() throws Exception {
1000 		assertEquals("1.0,1.7976931348623157E308,4.9E-324", serialize((HttpPartSchema)null, a(Double.valueOf(1), Double.MAX_VALUE, Double.MIN_VALUE)));
1001 	}
1002 
1003 	@Test void i06a_noSchemaTests_Boolean() throws Exception {
1004 		for (var v : l(Boolean.TRUE, Boolean.FALSE))
1005 			assertEquals(valueOf(v), serialize((HttpPartSchema)null, v));
1006 	}
1007 
1008 	@Test void i06b_noSchemaTests_BooleanArray() throws Exception {
1009 		assertEquals("true,false,null", serialize((HttpPartSchema)null, a(Boolean.TRUE, Boolean.FALSE, null)));
1010 	}
1011 
1012 	@Test void i07_noSchemaTests_Null() throws Exception {
1013 		assertEquals("null", serialize((HttpPartSchema)null, null));
1014 	}
1015 
1016 	@Test void i08a_noSchemaTests_String() throws Exception {
1017 		for (var v : l("foo", ""))
1018 			assertEquals(v, serialize((HttpPartSchema)null, v));
1019 	}
1020 	@Test void i08b_noSchemaTests_StringArray() throws Exception {
1021 		assertEquals("foo,,null", serialize((HttpPartSchema)null, a("foo", "", null)));
1022 	}
1023 }