You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2021/07/16 18:40:09 UTC

[juneau] branch master updated: JUnit tests.

This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 3697b92  JUnit tests.
3697b92 is described below

commit 3697b9207a0ef4b602c4c80cbdfe9adb2bb41797
Author: JamesBognar <ja...@salesforce.com>
AuthorDate: Fri Jul 16 14:39:46 2021 -0400

    JUnit tests.
---
 .../juneau/assertions/AssertionPredicate.java      |   2 +-
 .../juneau/assertions/AssertionPredicates.java     |   2 +-
 .../org/apache/juneau/assertions/Assertions.java   | 207 +-------
 .../juneau/assertions/FluentArrayAssertion.java    |  56 ++-
 .../assertions/FluentCollectionAssertion.java      |  20 +-
 .../juneau/assertions/FluentListAssertion.java     |   4 +-
 .../juneau/assertions/FluentMapAssertion.java      |  19 +-
 .../juneau/assertions/FluentObjectAssertion.java   |  10 +
 .../assertions/FluentPrimitiveArrayAssertion.java  |  35 +-
 .../apache/juneau/assertions/Messages.properties   |   5 +-
 .../org/apache/juneau/ContextPropertiesTest.java   | 178 +++----
 .../test/java/org/apache/juneau/Version_Test.java  |  16 +-
 .../juneau/assertions/ArrayAssertion_Test.java     | 177 ++++++-
 .../assertions/AssertionPredicates_Test.java       |   6 +
 .../apache/juneau/assertions/Assertion_Test.java   |   2 +-
 .../apache/juneau/assertions/Assertions_Test.java  | 104 +++-
 ...rtion_Test.java => BeanListAssertion_Test.java} |  69 +--
 .../juneau/assertions/BooleanAssertion_Test.java   |  13 -
 .../juneau/assertions/ByteArrayAssertion_Test.java |  25 +-
 .../juneau/assertions/DateAssertion_Test.java      |  16 -
 .../juneau/assertions/IntegerAssertion_Test.java   |  22 -
 .../juneau/assertions/LongAssertion_Test.java      |  23 -
 .../juneau/assertions/ObjectAssertion_Test.java    |  15 -
 .../juneau/assertions/VersionAssertion_Test.java   |  20 -
 .../assertions/ZonedDateTimeAssertion_Test.java    |  18 -
 .../java/org/apache/juneau/cp/BeanStore_Test.java  |   6 +-
 .../java/org/apache/juneau/cp/FileFinder_Test.java | 525 +++++++++++----------
 .../apache/juneau/dto/swagger/HeaderInfo_Test.java |  96 ++--
 .../org/apache/juneau/dto/swagger/Info_Test.java   |  12 +-
 .../org/apache/juneau/dto/swagger/Items_Test.java  |  86 ++--
 .../apache/juneau/dto/swagger/License_Test.java    |   8 +-
 .../apache/juneau/dto/swagger/Operation_Test.java  |  98 ++--
 .../juneau/dto/swagger/ParameterInfo_Test.java     | 108 ++---
 .../juneau/dto/swagger/ResponseInfo_Test.java      |  32 +-
 .../apache/juneau/dto/swagger/SchemaInfo_Test.java | 152 +++---
 .../juneau/dto/swagger/SecurityScheme_Test.java    |  12 +-
 .../apache/juneau/dto/swagger/Swagger_Test.java    | 144 +++---
 .../org/apache/juneau/dto/swagger/Tag_Test.java    |   6 +-
 .../org/apache/juneau/dto/swagger/Xml_Test.java    |  12 +-
 .../apache/juneau/http/BasicHttpResource_Test.java |   4 +-
 .../juneau/http/header/BasicDateHeader_Test.java   |   2 +-
 .../apache/juneau/http/header/HeaderList_Test.java |  38 +-
 .../apache/juneau/http/header/IfRange_Test.java    |   4 +-
 .../apache/juneau/http/header/RetryAfter_Test.java |   6 +-
 .../org/apache/juneau/http/part/PartList_Test.java |  38 +-
 .../org/apache/juneau/mstat/ThrownStore_Test.java  |   2 +-
 .../juneau/reflection/AnnotationInfoTest.java      |   4 +-
 .../org/apache/juneau/utils/ReflectionMapTest.java |   2 +-
 48 files changed, 1220 insertions(+), 1241 deletions(-)

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/AssertionPredicate.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/AssertionPredicate.java
index 6f22603..a09a47b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/AssertionPredicate.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/AssertionPredicate.java
@@ -26,7 +26,7 @@ import org.apache.juneau.cp.*;
  * Typically used wherever predicates are allowed for testing of {@link Assertion} objects such as...
  * <ul>
  * 	<li>{@link FluentObjectAssertion#passes(Predicate)}
- * 	<li>{@link FluentArrayAssertion#each(Predicate...)}
+ * 	<li>{@link FluentArrayAssertion#is(Predicate...)}
  * 	<li>{@link FluentPrimitiveArrayAssertion#each(Predicate...)}
  * 	<li>{@link FluentListAssertion#each(Predicate...)}
  * </ul>
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/AssertionPredicates.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/AssertionPredicates.java
index 1247a9f..b2a8e2e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/AssertionPredicates.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/AssertionPredicates.java
@@ -31,7 +31,7 @@ import org.apache.juneau.internal.*;
  * Typically used wherever predicates are allowed for testing of {@link Assertion} objects such as...
  * <ul>
  * 	<li>{@link FluentObjectAssertion#passes(Predicate)}
- * 	<li>{@link FluentArrayAssertion#each(Predicate...)}
+ * 	<li>{@link FluentArrayAssertion#is(Predicate...)}
  * 	<li>{@link FluentPrimitiveArrayAssertion#each(Predicate...)}
  * 	<li>{@link FluentListAssertion#each(Predicate...)}
  * </ul>
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/Assertions.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/Assertions.java
index 4bf41b2..1eb0b9c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/Assertions.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/Assertions.java
@@ -29,7 +29,8 @@ public class Assertions {
 
 	private static final Messages MESSAGES = Messages.of(Assertions.class, "Messages");
 	private static final String
-		MSG_argumentCannotBeNull = MESSAGES.getString("argumentCannotBeNull");
+		MSG_argumentCannotBeNull = MESSAGES.getString("argumentCannotBeNull"),
+		MSG_exceptionNotOfExpectedType = MESSAGES.getString("exceptionNotOfExpectedType");
 
 	/**
 	 * Used for assertion calls against {@link Date} objects.
@@ -48,23 +49,6 @@ public class Assertions {
 	}
 
 	/**
-	 * Used for assertion calls against {@link Date} objects.
-	 *
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode w800'>
-	 * 	<jc>// Validates the specified date is after the current date.</jc>
-	 * 	<jsm>assertDate</jsm>(<jv>myDate</jv>).isAfterNow();
-	 * </p>
-	 *
-	 * @param value The date being wrapped.
-	 * @return A new {@link DateAssertion} object.  Never <jk>null</jk>.
-	 */
-	public static final DateAssertion assertDate(Optional<Date> value) {
-		assertArgNotNull("value", value);
-		return assertDate(value.orElse(null));
-	}
-
-	/**
 	 * Used for assertion calls against {@link Version} objects.
 	 *
 	 * <h5 class='section'>Example:</h5>
@@ -81,23 +65,6 @@ public class Assertions {
 	}
 
 	/**
-	 * Used for assertion calls against {@link Version} objects.
-	 *
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode w800'>
-	 * 	<jc>// Validates the specified major version is greater than 2.</jc>
-	 * 	<jsm>assertVersion</jsm>(<jv>version</jv>).major().isGreaterThan(2);
-	 * </p>
-	 *
-	 * @param value The version object being wrapped.
-	 * @return A new {@link VersionAssertion} object.  Never <jk>null</jk>.
-	 */
-	public static final VersionAssertion assertVersion(Optional<Version> value) {
-		assertArgNotNull("value", value);
-		return assertVersion(value.orElse(null));
-	}
-
-	/**
 	 * Used for assertion calls against {@link ZonedDateTime} objects.
 	 *
 	 * <h5 class='section'>Example:</h5>
@@ -114,23 +81,6 @@ public class Assertions {
 	}
 
 	/**
-	 * Used for assertion calls against {@link ZonedDateTime} objects.
-	 *
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode w800'>
-	 * 	<jc>// Validates the specified date is after the current date.</jc>
-	 * 	<jsm>assertZonedDateTime</jsm>(<jv>byZdt</jv>).isAfterNow();
-	 * </p>
-	 *
-	 * @param value The date being wrapped.
-	 * @return A new {@link ZonedDateTimeAssertion} object.  Never <jk>null</jk>.
-	 */
-	public static final ZonedDateTimeAssertion assertZonedDateTime(Optional<ZonedDateTime> value) {
-		assertArgNotNull("value", value);
-		return assertZonedDateTime(value.orElse(null));
-	}
-
-	/**
 	 * Used for assertion calls against integers.
 	 *
 	 * <h5 class='section'>Example:</h5>
@@ -147,23 +97,6 @@ public class Assertions {
 	}
 
 	/**
-	 * Used for assertion calls against integers.
-	 *
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode w800'>
-	 * 	<jc>// Validates the response status code is 200 or 404.</jc>
-	 * 	<jsm>assertInteger</jsm>(<jv>httpReponse<jv>).isAny(200,404);
-	 * </p>
-	 *
-	 * @param value The object being wrapped.
-	 * @return A new {@link IntegerAssertion} object.  Never <jk>null</jk>.
-	 */
-	public static final IntegerAssertion assertInteger(Optional<Integer> value) {
-		assertArgNotNull("value", value);
-		return assertInteger(value.orElse(null));
-	}
-
-	/**
 	 * Used for assertion calls against longs.
 	 *
 	 * <h5 class='section'>Example:</h5>
@@ -191,23 +124,6 @@ public class Assertions {
 	 * @param value The object being wrapped.
 	 * @return A new {@link LongAssertion} object.  Never <jk>null</jk>.
 	 */
-	public static final LongAssertion assertLong(Optional<Long> value) {
-		assertArgNotNull("value", value);
-		return assertLong(value.orElse(null));
-	}
-
-	/**
-	 * Used for assertion calls against longs.
-	 *
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode w800'>
-	 * 	<jc>// Validates the response length isn't too long.</jc>
-	 * 	<jsm>assertLong</jsm>(<jv>responseLength</jv>).isLessThan(100000);
-	 * </p>
-	 *
-	 * @param value The object being wrapped.
-	 * @return A new {@link LongAssertion} object.  Never <jk>null</jk>.
-	 */
 	public static final <T extends Comparable<T>> ComparableAssertion<T> assertComparable(T value) {
 		return ComparableAssertion.create(value);
 	}
@@ -225,24 +141,25 @@ public class Assertions {
 	 * @return A new {@link ObjectAssertion} object.  Never <jk>null</jk>.
 	 */
 	public static final <T> ObjectAssertion<T> assertObject(T value) {
+		if (value instanceof Optional)
+			throw new RuntimeException("XXX");
 		return ObjectAssertion.create(value);
 	}
 
 	/**
-	 * Used for assertion calls against arbitrary POJOs.
+	 * Used for assertion calls against {@link Optional Optionals}.
 	 *
 	 * <h5 class='section'>Example:</h5>
 	 * <p class='bcode w800'>
 	 * 	<jc>// Validates the specified POJO is the specified type and serializes to the specified value.</jc>
-	 * 	<jsm>assertObject</jsm>(<jv>myPojo</jv>).isType(MyBean.<jk>class</jk>).asJson().is(<js>"{foo:'bar'}"</js>);
+	 * 	<jsm>assertOptional</jsm>(<jv>opt</jv>).isType(MyBean.<jk>class</jk>).asJson().is(<js>"{foo:'bar'}"</js>);
 	 * </p>
 	 *
 	 * @param value The object being wrapped.
 	 * @return A new {@link ObjectAssertion} object.  Never <jk>null</jk>.
 	 */
-	public static final <V> ObjectAssertion<V> assertObject(Optional<V> value) {
-		assertArgNotNull("value", value);
-		return assertObject(value.orElse(null));
+	public static final <T> ObjectAssertion<T> assertOptional(Optional<T> value) {
+		return ObjectAssertion.create(value.orElse(null));
 	}
 
 	/**
@@ -262,23 +179,6 @@ public class Assertions {
 	}
 
 	/**
-	 * Used for assertion calls against Java beans.
-	 *
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode w800'>
-	 * 	<jc>// Validates the specified POJO is the specified type and serializes to the specified value.</jc>
-	 * 	<jsm>assertBean</jsm>(<jv>myBean</jv>).isType(MyBean.<jk>class</jk>).fields(<js>"foo"</js>).asJson().is(<js>"{foo:'bar'}"</js>);
-	 * </p>
-	 *
-	 * @param value The object being wrapped.
-	 * @return A new {@link BeanAssertion} object.  Never <jk>null</jk>.
-	 */
-	public static final <V> BeanAssertion<V> assertBean(Optional<V> value) {
-		assertArgNotNull("value", value);
-		return assertBean(value.orElse(null));
-	}
-
-	/**
 	 * Used for assertion calls against lists of Java beans.
 	 *
 	 * <h5 class='section'>Example:</h5>
@@ -309,27 +209,12 @@ public class Assertions {
 	 * @return A new {@link StringAssertion} object.  Never <jk>null</jk>.
 	 */
 	public static final StringAssertion assertString(Object value) {
+		if (value instanceof Optional)
+			value = ((Optional<?>)value).orElse(null);
 		return StringAssertion.create(value);
 	}
 
 	/**
-	 * Used for assertion calls against string objects.
-	 *
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode w800'>
-	 * 	<jc>// Validates the response body of an HTTP call is the text "OK".</jc>
-	 * 	<jsm>assertString</jsm>(<jv>httpBody</jv>).is(<js>"OK"</js>);
-	 * </p>
-	 *
-	 * @param value The string being wrapped.
-	 * @return A new {@link StringAssertion} object.  Never <jk>null</jk>.
-	 */
-	public static final StringAssertion assertString(Optional<?> value) {
-		assertArgNotNull("value", value);
-		return assertString(value.orElse(null));
-	}
-
-	/**
 	 * Used for assertion calls against boolean objects.
 	 *
 	 * <h5 class='section'>Example:</h5>
@@ -346,23 +231,6 @@ public class Assertions {
 	}
 
 	/**
-	 * Used for assertion calls against boolean objects.
-	 *
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode w800'>
-	 * 	<jc>// Validates that the specified boolean object exists and is true.</jc>
-	 * 	<jsm>assertBoolean</jsm>(<jv>myBoolean</jv>).exists().isTrue();
-	 * </p>
-	 *
-	 * @param value The boolean being wrapped.
-	 * @return A new {@link BooleanAssertion} object.  Never <jk>null</jk>.
-	 */
-	public static final BooleanAssertion assertBoolean(Optional<Boolean> value) {
-		assertArgNotNull("value", value);
-		return assertBoolean(value.orElse(null));
-	}
-
-	/**
 	 * Used for assertion calls against throwable objects.
 	 *
 	 * <h5 class='section'>Example:</h5>
@@ -500,7 +368,7 @@ public class Assertions {
 		} catch (Throwable e) {
 			if (type.isInstance(e))
 				return assertThrowable((T)e);
-			throw new BasicAssertionError("Exception not of expected type.\n\tExpected: {1}.\n\tActual: {2}", type, e.getClass());
+			throw new BasicAssertionError(MSG_exceptionNotOfExpectedType, type, e.getClass());
 		}
 		return assertThrowable(null);
 	}
@@ -526,24 +394,6 @@ public class Assertions {
 	}
 
 	/**
-	 * Used for assertion calls against the contents of input streams.
-	 *
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode w800'>
-	 * 	<jc>// Validates that the stream contains the string "foo".</jc>
-	 * 	<jsm>assertStream</jsm>(<jv>myStream</jv>).asHex().is(<js>"666F6F"</js>);
-	 * </p>
-	 *
-	 * @param value The input stream being wrapped.
-	 * @return A new {@link ByteArrayAssertion} object.  Never <jk>null</jk>.
-	 * @throws IOException If thrown while reading contents from stream.
-	 */
-	public static final ByteArrayAssertion assertStream(Optional<InputStream> value) throws IOException {
-		assertArgNotNull("value", value);
-		return assertStream(value.orElse(null));
-	}
-
-	/**
 	 * Used for assertion calls against byte arrays.
 	 *
 	 * <h5 class='section'>Example:</h5>
@@ -560,23 +410,6 @@ public class Assertions {
 	}
 
 	/**
-	 * Used for assertion calls against byte arrays.
-	 *
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode w800'>
-	 * 	<jc>// Validates that the byte array contains the string "foo".</jc>
-	 * 	<jsm>assertBytes</jsm>(<jv>myBytes</jv>).asHex().is(<js>"666F6F"</js>);
-	 * </p>
-	 *
-	 * @param value The byte array being wrapped.
-	 * @return A new {@link ByteArrayAssertion} object.  Never <jk>null</jk>.
-	 */
-	public static final ByteArrayAssertion assertBytes(Optional<byte[]> value) {
-		assertArgNotNull("value", value);
-		return assertBytes(value.orElse(null));
-	}
-
-	/**
 	 * Used for assertion calls against the contents of readers.
 	 *
 	 * <h5 class='section'>Example:</h5>
@@ -594,24 +427,6 @@ public class Assertions {
 	}
 
 	/**
-	 * Used for assertion calls against the contents of readers.
-	 *
-	 * <h5 class='section'>Example:</h5>
-	 * <p class='bcode w800'>
-	 * 	<jc>// Validates the throwable message or one of the parent messages contain 'Foobar'.</jc>
-	 * 	<jsm>assertReader</jsm>(<jv>myReader</jv>).is(<js>"foo"</js>);
-	 * </p>
-	 *
-	 * @param value The reader being wrapped.
-	 * @return A new {@link StringAssertion} object.  Never <jk>null</jk>.
-	 * @throws IOException If thrown while reading contents from reader.
-	 */
-	public static final StringAssertion assertReader(Optional<Reader> value) throws IOException {
-		assertArgNotNull("value", value);
-		return assertReader(value.orElse(null));
-	}
-
-	/**
 	 * Throws an {@link IllegalArgumentException} if the specified argument is <jk>null</jk>.
 	 *
 	 * @param <T> The argument data type.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentArrayAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentArrayAssertion.java
index 779edba..c12b444 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentArrayAssertion.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentArrayAssertion.java
@@ -12,6 +12,7 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.assertions;
 
+import static org.apache.juneau.assertions.Assertions.*;
 import static org.apache.juneau.internal.ObjectUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
 import static java.util.Arrays.*;
@@ -40,7 +41,9 @@ public class FluentArrayAssertion<E,R> extends FluentObjectAssertion<E[],R> {
 		MSG_arrayUnexpectedSize = MESSAGES.getString("arrayUnexpectedSize"),
 		MSG_arrayDidNotContainExpectedValue = MESSAGES.getString("arrayDidNotContainExpectedValue"),
 		MSG_arrayContainedUnexpectedValue = MESSAGES.getString("arrayContainedUnexpectedValue"),
-		MSG_arrayDidNotContainExpectedValueAt = MESSAGES.getString("arrayDidNotContainExpectedValueAt");
+		MSG_arrayDidNotContainExpectedValueAt = MESSAGES.getString("arrayDidNotContainExpectedValueAt"),
+		MSG_arrayDidntContainAnyMatchingValue = MESSAGES.getString("arrayDidntContainAnyMatchingValue"),
+		MSG_arrayContainedNonMatchingValueAt = MESSAGES.getString("arrayContainedNonMatchingValueAt");
 
 	//-----------------------------------------------------------------------------------------------------------------
 	// Constructors
@@ -141,10 +144,11 @@ public class FluentArrayAssertion<E,R> extends FluentObjectAssertion<E[],R> {
 	 * @throws AssertionError If assertion failed or value was <jk>null</jk>.
 	 */
 	public R any(Predicate<E> test) throws AssertionError {
+		assertArgNotNull("test", test);
 		for (E v : value())
 			if (test.test(v))
 				return returns();
-		throw error(MSG_arrayDidNotContainExpectedValue, value());
+		throw error(MSG_arrayDidntContainAnyMatchingValue, (Object)value());
 	}
 
 	/**
@@ -155,9 +159,10 @@ public class FluentArrayAssertion<E,R> extends FluentObjectAssertion<E[],R> {
 	 * @throws AssertionError If assertion failed or value was <jk>null</jk>.
 	 */
 	public R all(Predicate<E> test) throws AssertionError {
-		for (E v : value())
-			if (! test.test(v))
-				throw error(MSG_arrayDidNotContainExpectedValue, value());
+		assertArgNotNull("test", test);
+		for (int i = 0, j = length(); i < j; i++)
+			if (! test.test(at(i)))
+				throw error(MSG_arrayContainedNonMatchingValueAt, i, getFailureMessage(test, at(i)));
 		return returns();
 	}
 
@@ -241,6 +246,20 @@ public class FluentArrayAssertion<E,R> extends FluentObjectAssertion<E[],R> {
 	}
 
 	/**
+	 * Asserts that the array does not contain the expected value.
+	 *
+	 * @param entry The value to check for.
+	 * @return The object to return after the test.
+	 * @throws AssertionError If assertion failed.
+	 */
+	public R doesNotContain(String entry) throws AssertionError {
+		for (int i = 0, j = length(); i < j; i++)
+			if (eq(stringify(at(i)), entry))
+				throw error(MSG_arrayContainedUnexpectedValue, entry, toString());
+		return returns();
+	}
+
+	/**
 	 * Asserts that the contents of this list contain the specified values when each entry is converted to a string.
 	 *
 	 * @param entries The expected entries in this list.
@@ -249,33 +268,33 @@ public class FluentArrayAssertion<E,R> extends FluentObjectAssertion<E[],R> {
 	 */
 	public R equals(String...entries) throws AssertionError {
 		Predicate<E>[] p = stream(entries).map(AssertionPredicates::eq).toArray(Predicate[]::new);
- 		return each(p);
+ 		return is(p);
 	}
 
 	/**
 	 * Asserts that the contents of this list contain the specified values when each entry is converted to a string.
 	 *
-	 * <p>
-	 * Equivalent to {@link #equals(String...)}
-	 *
 	 * @param entries The expected entries in this list.
 	 * @return The response object (for method chaining).
 	 * @throws AssertionError If assertion failed.
 	 */
-	public R is(String...entries) throws AssertionError {
-		return equals(entries);
+	public R equals(Object...entries) throws AssertionError {
+		Predicate<E>[] p = stream(entries).map(AssertionPredicates::eq).toArray(Predicate[]::new);
+ 		return is(p);
 	}
 
 	/**
 	 * Asserts that the contents of this list contain the specified values when each entry is converted to a string.
 	 *
+	 * <p>
+	 * Equivalent to {@link #equals(String...)}
+	 *
 	 * @param entries The expected entries in this list.
 	 * @return The response object (for method chaining).
 	 * @throws AssertionError If assertion failed.
 	 */
-	public R equals(Object...entries) throws AssertionError {
-		Predicate<E>[] p = stream(entries).map(AssertionPredicates::eq).toArray(Predicate[]::new);
- 		return each(p);
+	public R is(String...entries) throws AssertionError {
+		return equals(entries);
 	}
 
 	/**
@@ -303,12 +322,13 @@ public class FluentArrayAssertion<E,R> extends FluentObjectAssertion<E[],R> {
 	 * @throws AssertionError If assertion failed.
 	 */
 	@SafeVarargs
-	public final R each(Predicate<E>...tests) throws AssertionError {
+	public final R is(Predicate<E>...tests) throws AssertionError {
 		isSize(tests.length);
 		for (int i = 0, j = length(); i < j; i++) {
 			Predicate<E> t = tests[i];
-			if (t != null && ! t.test(at(i)))
-				throw error(MSG_arrayDidNotContainExpectedValueAt, i, getFailureMessage(t, at(i)));
+			if (t != null)
+				if (! t.test(at(i)))
+					throw error(MSG_arrayDidNotContainExpectedValueAt, i, getFailureMessage(t, at(i)));
 		}
 		return returns();
 	}
@@ -368,7 +388,7 @@ public class FluentArrayAssertion<E,R> extends FluentObjectAssertion<E[],R> {
 	}
 
 	private E at(int index) {
-		return valueIsNull() || index >= length() ? null : value()[index];
+		return valueIsNull() || index >= length() || index < 0 ? null : value()[index];
 	}
 
 	@Override
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentCollectionAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentCollectionAssertion.java
index 544b684..a8d3071 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentCollectionAssertion.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentCollectionAssertion.java
@@ -73,6 +73,20 @@ public class FluentCollectionAssertion<E,R> extends FluentObjectAssertion<Collec
 		return new FluentCollectionAssertion<>(this, function.apply(orElse(null)), returns());
 	}
 
+
+	/**
+	 * Returns an integer assertion on the size of this collection.
+	 *
+	 * <p>
+	 * If the collection is <jk>null</jk>, the returned assertion is a null assertion
+	 * (meaning {@link FluentIntegerAssertion#exists()} returns <jk>false</jk>).
+	 *
+	 * @return A new assertion.
+	 */
+	public FluentIntegerAssertion<R> size() {
+		return new FluentIntegerAssertion<>(this, valueIsNull() ? null : value().size(), returns());
+	}
+
 	//-----------------------------------------------------------------------------------------------------------------
 	// Test methods
 	//-----------------------------------------------------------------------------------------------------------------
@@ -165,8 +179,8 @@ public class FluentCollectionAssertion<E,R> extends FluentObjectAssertion<Collec
 	 * @throws AssertionError If assertion failed or value was <jk>null</jk>.
 	 */
 	public R isSize(int size) throws AssertionError {
-		if (size() != size)
-			throw error(MSG_collectionDidNotHaveExpectedSize, size, size());
+		if (getSize() != size)
+			throw error(MSG_collectionDidNotHaveExpectedSize, size, getSize());
 		return returns();
 	}
 
@@ -218,7 +232,7 @@ public class FluentCollectionAssertion<E,R> extends FluentObjectAssertion<Collec
 	 * @return the size of this collection if it is not <jk>null</jk>.
 	 * @throws AssertionError If value was <jk>null</jk>.
 	 */
-	protected int size() throws AssertionError {
+	protected int getSize() throws AssertionError {
 		return value().size();
 	}
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentListAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentListAssertion.java
index ecf7f5a..27f5585 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentListAssertion.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentListAssertion.java
@@ -179,7 +179,7 @@ public class FluentListAssertion<E,R> extends FluentCollectionAssertion<E,R> {
 	@SafeVarargs
 	public final R each(Predicate<E>...tests) throws AssertionError {
 		isSize(tests.length);
-		for (int i = 0, j = size(); i < j; i++) {
+		for (int i = 0, j = getSize(); i < j; i++) {
 			Predicate<E> t = tests[i];
 			if (t != null && ! t.test(at(i)))
 				throw error(MSG_listDidNotContainExpectedValueAt, i, getFailureMessage(t, at(i)));
@@ -235,7 +235,7 @@ public class FluentListAssertion<E,R> extends FluentCollectionAssertion<E,R> {
 	}
 
 	private E at(int index) throws AssertionError {
-		return valueIsNull() || index >= size() ? null : value().get(index);
+		return valueIsNull() || index >= getSize() ? null : value().get(index);
 	}
 
 	private List<E> toSortedList(Comparator<E> comparator) {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentMapAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentMapAssertion.java
index 42ae70e..e687f69 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentMapAssertion.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentMapAssertion.java
@@ -118,6 +118,19 @@ public class FluentMapAssertion<K,V,R> extends FluentObjectAssertion<Map<K,V>,R>
 		return new FluentMapAssertion<>(this, m2, returns());
 	}
 
+	/**
+	 * Returns an integer assertion on the size of this map.
+	 *
+	 * <p>
+	 * If the map is <jk>null</jk>, the returned assertion is a null assertion
+	 * (meaning {@link FluentIntegerAssertion#exists()} returns <jk>false</jk>).
+	 *
+	 * @return A new assertion.
+	 */
+	public FluentIntegerAssertion<R> size() {
+		return new FluentIntegerAssertion<>(this, valueIsNull() ? null : value().size(), returns());
+	}
+
 	//-----------------------------------------------------------------------------------------------------------------
 	// Test methods
 	//-----------------------------------------------------------------------------------------------------------------
@@ -180,8 +193,8 @@ public class FluentMapAssertion<K,V,R> extends FluentObjectAssertion<Map<K,V>,R>
 	 * @throws AssertionError If assertion failed or value was <jk>null</jk>.
 	 */
 	public R isSize(int size) throws AssertionError {
-		if (size() != size)
-			throw error(MSG_mapDidNotHaveTheExpectedSize, size, size());
+		if (size2() != size)
+			throw error(MSG_mapDidNotHaveTheExpectedSize, size, size2());
 		return returns();
 	}
 
@@ -231,7 +244,7 @@ public class FluentMapAssertion<K,V,R> extends FluentObjectAssertion<Map<K,V>,R>
 		return orElse(emptyMap()).get(key);
 	}
 
-	private int size() {
+	private int size2() {
 		return value().size();
 	}
 }
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java
index 6cc0546..dfb4929 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java
@@ -417,6 +417,16 @@ public class FluentObjectAssertion<T,R> extends FluentAssertion<R> {
 	}
 
 	/**
+	 * Converts this object assertion into a bean assertion.
+	 *
+	 * @return A new assertion.
+	 * @throws AssertionError If object is not a bean.
+	 */
+	public FluentBeanAssertion<T,R> asBean() {
+		return new FluentBeanAssertion<>(this, orElse(null), returns());
+	}
+
+	/**
 	 * Converts this object assertion into a list-of-beans assertion.
 	 *
 	 * @param beanType The bean type.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentPrimitiveArrayAssertion.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentPrimitiveArrayAssertion.java
index b2708c1..310078b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentPrimitiveArrayAssertion.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/assertions/FluentPrimitiveArrayAssertion.java
@@ -110,6 +110,19 @@ public class FluentPrimitiveArrayAssertion<T,R> extends FluentObjectAssertion<T,
 		return new FluentObjectAssertion<>(this, at(index), returns());
 	}
 
+	/**
+	 * Returns an integer assertion on the length of this array.
+	 *
+	 * <p>
+	 * If the array is <jk>null</jk> or the index is out-of-bounds, the returned assertion is a null assertion
+	 * (meaning {@link FluentIntegerAssertion#exists()} returns <jk>false</jk>).
+	 *
+	 * @return A new assertion.
+	 */
+	public FluentIntegerAssertion<R> length() {
+		return new FluentIntegerAssertion<>(this, valueIsNull() ? null : Array.getLength(value()), returns());
+	}
+
 	//-----------------------------------------------------------------------------------------------------------------
 	// Test methods
 	//-----------------------------------------------------------------------------------------------------------------
@@ -122,7 +135,7 @@ public class FluentPrimitiveArrayAssertion<T,R> extends FluentObjectAssertion<T,
 	 * @throws AssertionError If assertion failed or value was <jk>null</jk>.
 	 */
 	public R any(Predicate<T> test) throws AssertionError {
-		for (int i = 0, j = length(); i < j; i++)
+		for (int i = 0, j = length2(); i < j; i++)
 			if (test.test(at(i)))
 				return returns();
 		throw error(MSG_arrayDidNotContainExpectedValue, value());
@@ -136,7 +149,7 @@ public class FluentPrimitiveArrayAssertion<T,R> extends FluentObjectAssertion<T,
 	 * @throws AssertionError If assertion failed or value was <jk>null</jk>.
 	 */
 	public R all(Predicate<T> test) throws AssertionError {
-		for (int i = 0, j = length(); i < j; i++)
+		for (int i = 0, j = length2(); i < j; i++)
 			if (! test.test(at(i)))
 				throw error(MSG_arrayDidNotContainExpectedValue, value());
 		return returns();
@@ -149,7 +162,7 @@ public class FluentPrimitiveArrayAssertion<T,R> extends FluentObjectAssertion<T,
 	 * @throws AssertionError If assertion failed.
 	 */
 	public R isEmpty() throws AssertionError {
-		if (length() != 0)
+		if (length2() != 0)
 			throw error(MSG_arrayWasNotEmpty);
 		return returns();
 	}
@@ -161,7 +174,7 @@ public class FluentPrimitiveArrayAssertion<T,R> extends FluentObjectAssertion<T,
 	 * @throws AssertionError If assertion failed.
 	 */
 	public R isNotEmpty() throws AssertionError {
-		if (length() == 0)
+		if (length2() == 0)
 			throw error(MSG_arrayWasEmpty);
 		return returns();
 	}
@@ -174,7 +187,7 @@ public class FluentPrimitiveArrayAssertion<T,R> extends FluentObjectAssertion<T,
 	 * @throws AssertionError If assertion failed.
 	 */
 	public R isSize(int size) throws AssertionError {
-		if (length() != size)
+		if (length2() != size)
 			throw error(MSG_arrayDidNotHaveExpectedSize, size, length());
 		return returns();
 	}
@@ -187,7 +200,7 @@ public class FluentPrimitiveArrayAssertion<T,R> extends FluentObjectAssertion<T,
 	 * @throws AssertionError If assertion failed.
 	 */
 	public R contains(Object entry) throws AssertionError {
-		for (int i = 0, j = length(); i < j; i++)
+		for (int i = 0, j = length2(); i < j; i++)
 			if (eq(at(i), entry))
 				return returns();
 		throw error(MSG_arrayDidNotContainExpectedValue, entry, value());
@@ -256,8 +269,8 @@ public class FluentPrimitiveArrayAssertion<T,R> extends FluentObjectAssertion<T,
 	 */
 	@SuppressWarnings("unchecked")
 	public R each(Predicate<T>...tests) throws AssertionError {
-		isSize(tests.length);
-		for (int i = 0, j = length(); i < j; i++) {
+		length().is(tests.length);
+		for (int i = 0, j = length2(); i < j; i++) {
 			Predicate<T> t = tests[i];
 			if (t != null && ! t.test(at(i)))
 				throw error(MSG_arrayDidNotContainExpectedValueAt, i, getFailureMessage(t, at(i)));
@@ -273,7 +286,7 @@ public class FluentPrimitiveArrayAssertion<T,R> extends FluentObjectAssertion<T,
 	 * @throws AssertionError If assertion failed.
 	 */
 	public R doesNotContain(Object entry) throws AssertionError {
-		for (int i = 0; i < length(); i++)
+		for (int i = 0; i < length2(); i++)
 			if (eq(at(i), entry))
 				throw error(MSG_arrayContainedUnexpectedValue, entry, value());
 		return returns();
@@ -323,10 +336,10 @@ public class FluentPrimitiveArrayAssertion<T,R> extends FluentObjectAssertion<T,
 
 	@SuppressWarnings("unchecked")
 	private T at(int index) {
-		return valueIsNull() || index >= length() ? null : (T)Array.get(value(), index);
+		return valueIsNull() || index >= length2() ? null : (T)Array.get(value(), index);
 	}
 
-	private int length() {
+	private int length2() {
 		return Array.getLength(value());
 	}
 
diff --git a/juneau-core/juneau-marshall/src/main/resources/org/apache/juneau/assertions/Messages.properties b/juneau-core/juneau-marshall/src/main/resources/org/apache/juneau/assertions/Messages.properties
index 16595c5..8e97b57 100644
--- a/juneau-core/juneau-marshall/src/main/resources/org/apache/juneau/assertions/Messages.properties
+++ b/juneau-core/juneau-marshall/src/main/resources/org/apache/juneau/assertions/Messages.properties
@@ -29,13 +29,16 @@ AssertionPredicates.valueWasNotExpectedType = Value was not expected type.\n\tEx
 AssertionPredicates.valueDidNotMatchPattern = Value did not match pattern.\n\tPattern=''{0}''.\n\tValue=''{1}''.
 
 Assertions.argumentCannotBeNull = Argument ''{0}'' cannot be null.
+Assertions.exceptionNotOfExpectedType = Exception not of expected type.\n\tExpect=''{0}''.\n\tActual=''{1}''.
 
 FluentArrayAssertion.arrayWasNotEmpty = Array was not empty.
 FluentArrayAssertion.arrayWasEmpty = Array was empty.
 FluentArrayAssertion.arrayUnexpectedSize = Array did not have the expected size.\n\tExpect={0}.\n\tActual={1}.
 FluentArrayAssertion.arrayDidNotContainExpectedValue = Array did not contain expected value.\n\tExpect=''{0}''.\n\tActual=''{1}''.
 FluentArrayAssertion.arrayContainedUnexpectedValue = Array contained unexpected value.\n\tUnexpected=''{0}''.\n\tActual=''{1}''.
-FluentArrayAssertion.arrayDidNotContainExpectedValueAt = Array did not contain expected value at index {0}.\n\t{1}.
+FluentArrayAssertion.arrayDidNotContainExpectedValueAt = Array did not contain expected value at index {0}.\n\t{1}
+FluentArrayAssertion.arrayDidntContainAnyMatchingValue = Array did not contain any matching value.\n\tValue=''{0}''.
+FluentArrayAssertion.arrayContainedNonMatchingValueAt = Array contained non-matching value at index {0}.\n\t{1}
 
 FluentBooleanAssertion.valueWasFalse = Value was false.
 FluentBooleanAssertion.valueWasTrue = Value was true.
diff --git a/juneau-utest/src/test/java/org/apache/juneau/ContextPropertiesTest.java b/juneau-utest/src/test/java/org/apache/juneau/ContextPropertiesTest.java
index 0aed42f..e22fba7 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/ContextPropertiesTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/ContextPropertiesTest.java
@@ -78,11 +78,11 @@ public class ContextPropertiesTest {
 		b.set("A.f6.s", null);
 		cp = b.build();
 		assertObject(cp).asJson().is("{A:{'f1.s':'1','f2.s':'2','f3.s':'true','f4.s':'{foo:\\'bar\\'}','f5.s':'[1,2]'}}");
-		assertObject(cp.get("A.f1.s")).isType(String.class);
-		assertObject(cp.get("A.f2.s")).isType(String.class);
-		assertObject(cp.get("A.f3.s")).isType(String.class);
-		assertObject(cp.get("A.f4.s")).isType(String.class);
-		assertObject(cp.get("A.f5.s")).isType(String.class);
+		assertOptional(cp.get("A.f1.s")).isType(String.class);
+		assertOptional(cp.get("A.f2.s")).isType(String.class);
+		assertOptional(cp.get("A.f3.s")).isType(String.class);
+		assertOptional(cp.get("A.f4.s")).isType(String.class);
+		assertOptional(cp.get("A.f5.s")).isType(String.class);
 
 		b.clear();
 		b.set("A.f1", "1");
@@ -93,11 +93,11 @@ public class ContextPropertiesTest {
 		b.set("A.f6", null);
 		cp = b.build();
 		assertObject(cp).asJson().is("{A:{f1:'1',f2:'2',f3:'true',f4:'{foo:\\'bar\\'}',f5:'[1,2]'}}");
-		assertObject(cp.get("A.f1")).isType(String.class);
-		assertObject(cp.get("A.f2")).isType(String.class);
-		assertObject(cp.get("A.f3")).isType(String.class);
-		assertObject(cp.get("A.f4")).isType(String.class);
-		assertObject(cp.get("A.f5")).isType(String.class);
+		assertOptional(cp.get("A.f1")).isType(String.class);
+		assertOptional(cp.get("A.f2")).isType(String.class);
+		assertOptional(cp.get("A.f3")).isType(String.class);
+		assertOptional(cp.get("A.f4")).isType(String.class);
+		assertOptional(cp.get("A.f5")).isType(String.class);
 
 		b.set("A.f1", "x1");
 		b.set("A.f2", null);
@@ -123,10 +123,10 @@ public class ContextPropertiesTest {
 		b.set("A.f5.b", null);
 		cp = b.build();
 		assertObject(cp).asJson().is("{A:{'f1.b':true,'f2.b':false,'f3.b':true,'f4.b':false}}");
-		assertObject(cp.get("A.f1.b")).isType(Boolean.class);
-		assertObject(cp.get("A.f2.b")).isType(Boolean.class);
-		assertObject(cp.get("A.f3.b")).isType(Boolean.class);
-		assertObject(cp.get("A.f4.b")).isType(Boolean.class);
+		assertOptional(cp.get("A.f1.b")).isType(Boolean.class);
+		assertOptional(cp.get("A.f2.b")).isType(Boolean.class);
+		assertOptional(cp.get("A.f3.b")).isType(Boolean.class);
+		assertOptional(cp.get("A.f4.b")).isType(Boolean.class);
 
 		// Test nulls
 		b.set("A.f2.b", null);
@@ -151,10 +151,10 @@ public class ContextPropertiesTest {
 		b.set("A.f5.i", null);
 		cp = b.build();
 		assertObject(cp).asJson().is("{A:{'f1.i':123,'f2.i':123,'f3.i':123,'f4.i':-1}}");
-		assertObject(cp.get("A.f1.i")).isType(Integer.class);
-		assertObject(cp.get("A.f2.i")).isType(Integer.class);
-		assertObject(cp.get("A.f3.i")).isType(Integer.class);
-		assertObject(cp.get("A.f4.i")).isType(Integer.class);
+		assertOptional(cp.get("A.f1.i")).isType(Integer.class);
+		assertOptional(cp.get("A.f2.i")).isType(Integer.class);
+		assertOptional(cp.get("A.f3.i")).isType(Integer.class);
+		assertOptional(cp.get("A.f4.i")).isType(Integer.class);
 
 		// Test nulls
 		b.set("A.f2.i", null);
@@ -178,7 +178,7 @@ public class ContextPropertiesTest {
 		b.set("A.f3.c", null);
 		cp = b.build();
 		assertObject(cp).asJson().is("{A:{'f1.c':'java.lang.String','f2.c':'java.lang.Integer'}}");
-		assertObject(cp.get("A.f1.c")).isType(Class.class);
+		assertOptional(cp.get("A.f1.c")).isType(Class.class);
 
 		// Test nulls
 		b.set("A.f2.c", null);
@@ -203,10 +203,10 @@ public class ContextPropertiesTest {
 		b.set("A.f5.o", null);
 		cp = b.build();
 		assertObject(cp).asJson().is("{A:{'f1.o':123,'f2.o':true,'f3.o':'123','f4.o':'java.lang.StringBuilder'}}");
-		assertObject(cp.get("A.f1.o")).isType(Integer.class);
-		assertObject(cp.get("A.f2.o")).isType(Boolean.class);
-		assertObject(cp.get("A.f3.o")).isType(StringBuilder.class);
-		assertObject(cp.get("A.f4.o")).isType(Class.class);
+		assertOptional(cp.get("A.f1.o")).isType(Integer.class);
+		assertOptional(cp.get("A.f2.o")).isType(Boolean.class);
+		assertOptional(cp.get("A.f3.o")).isType(StringBuilder.class);
+		assertOptional(cp.get("A.f4.o")).isType(Class.class);
 
 		// Test nulls
 		b.set("A.f2.o", null);
@@ -231,10 +231,10 @@ public class ContextPropertiesTest {
 		b.set("A.f5.ss", null);
 		cp = b.build();
 		assertObject(cp).asJson().is("{A:{'f1.ss':['bar','foo'],'f2.ss':['123','ONE','true'],'f3.ss':['foo'],'f4.ss':['123','foo','true']}}");
-		assertObject(cp.get("A.f1.ss")).isType(Set.class);
-		assertObject(cp.get("A.f2.ss")).isType(Set.class);
-		assertObject(cp.get("A.f3.ss")).isType(Set.class);
-		assertObject(cp.get("A.f4.ss")).isType(Set.class);
+		assertOptional(cp.get("A.f1.ss")).isType(Set.class);
+		assertOptional(cp.get("A.f2.ss")).isType(Set.class);
+		assertOptional(cp.get("A.f3.ss")).isType(Set.class);
+		assertOptional(cp.get("A.f4.ss")).isType(Set.class);
 
 		b.clear();
 		b.set("A.f1.ss/add", "foo");
@@ -293,10 +293,10 @@ public class ContextPropertiesTest {
 		b.set("A.f5.si", null);
 		cp = b.build();
 		assertObject(cp).asJson().is("{A:{'f1.si':[1,2,3],'f2.si':[123,456],'f3.si':[123],'f4.si':[1,2,3]}}");
-		assertObject(cp.get("A.f1.si")).isType(Set.class);
-		assertObject(cp.get("A.f2.si")).isType(Set.class);
-		assertObject(cp.get("A.f3.si")).isType(Set.class);
-		assertObject(cp.get("A.f4.si")).isType(Set.class);
+		assertOptional(cp.get("A.f1.si")).isType(Set.class);
+		assertOptional(cp.get("A.f2.si")).isType(Set.class);
+		assertOptional(cp.get("A.f3.si")).isType(Set.class);
+		assertOptional(cp.get("A.f4.si")).isType(Set.class);
 
 		b.clear();
 		b.set("A.f1.si/add", "123");
@@ -377,8 +377,8 @@ public class ContextPropertiesTest {
 		b.set("A.f3.sc", null);
 		cp = b.build();
 		assertObject(cp).asJson().is("{A:{'f1.sc':['java.lang.Integer','java.lang.String'],'f2.sc':['java.lang.Integer','java.lang.String']}}");
-		assertObject(cp.get("A.f1.sc")).isType(Set.class);
-		assertObject(cp.get("A.f2.sc")).isType(Set.class);
+		assertOptional(cp.get("A.f1.sc")).isType(Set.class);
+		assertOptional(cp.get("A.f2.sc")).isType(Set.class);
 		assertObject(((Set<?>)cp.get("A.f1.sc").get()).iterator().next()).isType(Class.class);
 
 		b.clear();
@@ -437,10 +437,10 @@ public class ContextPropertiesTest {
 		b.set("A.f5.ls", null);
 		cp = b.build();
 		assertObject(cp).asJson().is("{A:{'f1.ls':['foo','bar'],'f2.ls':['123','true','ONE'],'f3.ls':['foo'],'f4.ls':['foo','123','true']}}");
-		assertObject(cp.get("A.f1.ls")).isType(List.class);
-		assertObject(cp.get("A.f2.ls")).isType(List.class);
-		assertObject(cp.get("A.f3.ls")).isType(List.class);
-		assertObject(cp.get("A.f4.ls")).isType(List.class);
+		assertOptional(cp.get("A.f1.ls")).isType(List.class);
+		assertOptional(cp.get("A.f2.ls")).isType(List.class);
+		assertOptional(cp.get("A.f3.ls")).isType(List.class);
+		assertOptional(cp.get("A.f4.ls")).isType(List.class);
 
 		b.clear();
 		b.set("A.f1.ls/prepend", "foo");
@@ -501,10 +501,10 @@ public class ContextPropertiesTest {
 		b.set("A.f5.li", null);
 		cp = b.build();
 		assertObject(cp).asJson().is("{A:{'f1.li':[1,2,3],'f2.li':[123,456],'f3.li':[123],'f4.li':[1,2,3]}}");
-		assertObject(cp.get("A.f1.li")).isType(List.class);
-		assertObject(cp.get("A.f2.li")).isType(List.class);
-		assertObject(cp.get("A.f3.li")).isType(List.class);
-		assertObject(cp.get("A.f4.li")).isType(List.class);
+		assertOptional(cp.get("A.f1.li")).isType(List.class);
+		assertOptional(cp.get("A.f2.li")).isType(List.class);
+		assertOptional(cp.get("A.f3.li")).isType(List.class);
+		assertOptional(cp.get("A.f4.li")).isType(List.class);
 
 		b.clear();
 		b.set("A.f1.li/prepend", "123");
@@ -603,8 +603,8 @@ public class ContextPropertiesTest {
 		b.set("A.f3.lc", null);
 		cp = b.build();
 		assertObject(cp).asJson().is("{A:{'f1.lc':['java.lang.String','java.lang.Integer'],'f2.lc':['java.lang.String','java.lang.Integer']}}");
-		assertObject(cp.get("A.f1.lc")).isType(List.class);
-		assertObject(cp.get("A.f2.lc")).isType(List.class);
+		assertOptional(cp.get("A.f1.lc")).isType(List.class);
+		assertOptional(cp.get("A.f2.lc")).isType(List.class);
 
 		b.clear();
 		b.set("A.f1.lc/prepend", Integer.class);
@@ -676,8 +676,8 @@ public class ContextPropertiesTest {
 		b.set("A.f3.lo", null);
 		cp = b.build();
 		assertObject(cp).asJson().is("{A:{'f1.lo':['java.lang.StringBuilder'],'f2.lo':[123,true,'','java.lang.StringBuilder']}}");
-		assertObject(cp.get("A.f1.lo")).isType(List.class);
-		assertObject(cp.get("A.f2.lo")).isType(List.class);
+		assertOptional(cp.get("A.f1.lo")).isType(List.class);
+		assertOptional(cp.get("A.f2.lo")).isType(List.class);
 		assertObject(((List<?>)cp.get("A.f1.lo").get()).get(0)).isType(Class.class);
 		assertObject(((List<?>)cp.get("A.f2.lo").get()).get(0)).isType(Integer.class);
 		assertObject(((List<?>)cp.get("A.f2.lo").get()).get(1)).isType(Boolean.class);
@@ -751,10 +751,10 @@ public class ContextPropertiesTest {
 		b.set("A.f5.sms", null);
 		cp = b.build();
 		assertObject(cp).asJson().is("{A:{'f1.sms':{baz:'qux',foo:'bar'},'f2.sms':{bar:'true',baz:'ONE',foo:'123'},'f3.sms':{foo:'bar'},'f4.sms':{baz:'123',foo:'bar',qux:'true'}}}");
-		assertObject(cp.get("A.f1.sms")).isType(Map.class);
-		assertObject(cp.get("A.f2.sms")).isType(Map.class);
-		assertObject(cp.get("A.f3.sms")).isType(Map.class);
-		assertObject(cp.get("A.f4.sms")).isType(Map.class);
+		assertOptional(cp.get("A.f1.sms")).isType(Map.class);
+		assertOptional(cp.get("A.f2.sms")).isType(Map.class);
+		assertOptional(cp.get("A.f3.sms")).isType(Map.class);
+		assertOptional(cp.get("A.f4.sms")).isType(Map.class);
 
 		b.clear();
 		b.set("A.f1.sms/put", "{foo:'bar'}");
@@ -787,10 +787,10 @@ public class ContextPropertiesTest {
 		b.set("A.f5.smi", null);
 		cp = b.build();
 		assertObject(cp).asJson().is("{A:{'f1.smi':{baz:2,foo:1},'f2.smi':{bar:456,foo:123},'f3.smi':{foo:123},'f4.smi':{baz:456,foo:123}}}");
-		assertObject(cp.get("A.f1.smi")).isType(Map.class);
-		assertObject(cp.get("A.f2.smi")).isType(Map.class);
-		assertObject(cp.get("A.f3.smi")).isType(Map.class);
-		assertObject(cp.get("A.f4.smi")).isType(Map.class);
+		assertOptional(cp.get("A.f1.smi")).isType(Map.class);
+		assertOptional(cp.get("A.f2.smi")).isType(Map.class);
+		assertOptional(cp.get("A.f3.smi")).isType(Map.class);
+		assertOptional(cp.get("A.f4.smi")).isType(Map.class);
 
 		b.clear();
 		b.set("A.f1.smi/put", "{foo:'123'}");
@@ -821,8 +821,8 @@ public class ContextPropertiesTest {
 		b.set("A.f3.smc", null);
 		cp = b.build();
 		assertObject(cp).asJson().is("{A:{'f1.smc':{baz:'java.lang.Integer',foo:'java.lang.String'},'f2.smc':{bar:'java.lang.Integer',foo:'java.lang.String'}}}");
-		assertObject(cp.get("A.f1.smc")).isType(Map.class);
-		assertObject(cp.get("A.f2.smc")).isType(Map.class);
+		assertOptional(cp.get("A.f1.smc")).isType(Map.class);
+		assertOptional(cp.get("A.f2.smc")).isType(Map.class);
 		assertObject(((Map<?,?>)cp.get("A.f1.smc").get()).values().iterator().next()).isType(Class.class);
 		assertObject(((Map<?,?>)cp.get("A.f2.smc").get()).values().iterator().next()).isType(Class.class);
 
@@ -854,10 +854,10 @@ public class ContextPropertiesTest {
 		b.set("A.f5.smo", null);
 		cp = b.build();
 		assertObject(cp).asJson().is("{A:{'f1.smo':{baz:'2',foo:'1'},'f2.smo':{bar:'java.lang.StringBuilder',foo:123},'f3.smo':{foo:'123'},'f4.smo':{baz:456,foo:'123'}}}");
-		assertObject(cp.get("A.f1.smo")).isType(Map.class);
-		assertObject(cp.get("A.f2.smo")).isType(Map.class);
-		assertObject(cp.get("A.f3.smo")).isType(Map.class);
-		assertObject(cp.get("A.f4.smo")).isType(Map.class);
+		assertOptional(cp.get("A.f1.smo")).isType(Map.class);
+		assertOptional(cp.get("A.f2.smo")).isType(Map.class);
+		assertOptional(cp.get("A.f3.smo")).isType(Map.class);
+		assertOptional(cp.get("A.f4.smo")).isType(Map.class);
 
 		b.clear();
 		b.set("A.f1.smo/put", "{foo:'123'}");
@@ -1396,7 +1396,7 @@ public class ContextPropertiesTest {
 
 		System.clearProperty("A.f1");
 		cp = ContextProperties.create().build();
-		assertObject(cp.get("A.f1")).isNull();
+		assertOptional(cp.get("A.f1")).isNull();
 	}
 
 	@Test
@@ -1404,15 +1404,15 @@ public class ContextPropertiesTest {
 
 		System.setProperty("A.f1.i", "1");
 		ContextProperties cp = ContextProperties.create().build();
-		assertObject(cp.get("A.f1.i")).isType(Integer.class).is(1);
+		assertOptional(cp.get("A.f1.i")).isType(Integer.class).is(1);
 
 		System.clearProperty("A.f1.i");
 		System.setProperty("A.f1", "1");
 		cp = ContextProperties.create().build();
-		assertObject(cp.get("A.f1.i")).isType(Integer.class).is(1);
+		assertOptional(cp.get("A.f1.i")).isType(Integer.class).is(1);
 
 		System.clearProperty("A.f1");
-		assertObject(cp.get("A.f1.i")).isNull();
+		assertOptional(cp.get("A.f1.i")).isNull();
 	}
 
 	@Test
@@ -1420,14 +1420,14 @@ public class ContextPropertiesTest {
 
 		System.setProperty("A.f1.o", "123");
 		ContextProperties cp = ContextProperties.create().build();
-		assertObject(cp.get("A.f1.o")).isType(String.class).is("123");
+		assertOptional(cp.get("A.f1.o")).isType(String.class).is("123");
 
 		System.clearProperty("A.f1.o");
 		System.setProperty("A.f1", "123");
-		assertObject(cp.get("A.f1.o")).isType(String.class).is("123");
+		assertOptional(cp.get("A.f1.o")).isType(String.class).is("123");
 
 		System.clearProperty("A.f1");
-		assertObject(cp.get("A.f1.o")).isNull();
+		assertOptional(cp.get("A.f1.o")).isNull();
 	}
 
 	@Test
@@ -1435,15 +1435,15 @@ public class ContextPropertiesTest {
 
 		System.setProperty("A.f1.ss", "['foo','bar']");
 		ContextProperties cp = ContextProperties.create().build();
-		assertObject(cp.get("A.f1.ss")).asJson().is("['bar','foo']");
+		assertOptional(cp.get("A.f1.ss")).asJson().is("['bar','foo']");
 
 		System.clearProperty("A.f1.ss");
 		System.setProperty("A.f1", "['foo','bar']");
 		cp = ContextProperties.create().build();
-		assertObject(cp.get("A.f1.ss")).asJson().is("['bar','foo']");
+		assertOptional(cp.get("A.f1.ss")).asJson().is("['bar','foo']");
 
 		System.clearProperty("A.f1");
-		assertObject(cp.get("A.f1.ss")).isNull();
+		assertOptional(cp.get("A.f1.ss")).isNull();
 	}
 
 	@Test
@@ -1451,15 +1451,15 @@ public class ContextPropertiesTest {
 
 		System.setProperty("A.f1.si", "['2','1']");
 		ContextProperties cp = ContextProperties.create().build();
-		assertObject(cp.get("A.f1.si")).asJson().is("[1,2]");
+		assertOptional(cp.get("A.f1.si")).asJson().is("[1,2]");
 
 		System.clearProperty("A.f1.si");
 		System.setProperty("A.f1", "['2','1']");
 		cp = ContextProperties.create().build();
-		assertObject(cp.get("A.f1.si")).asJson().is("[1,2]");
+		assertOptional(cp.get("A.f1.si")).asJson().is("[1,2]");
 
 		System.clearProperty("A.f1");
-		assertObject(cp.get("A.f1.si")).isNull();
+		assertOptional(cp.get("A.f1.si")).isNull();
 	}
 
 	@Test
@@ -1467,15 +1467,15 @@ public class ContextPropertiesTest {
 
 		System.setProperty("A.f1.ls", "['foo','bar']");
 		ContextProperties cp = ContextProperties.create().build();
-		assertObject(cp.get("A.f1.ls")).asJson().is("['foo','bar']");
+		assertOptional(cp.get("A.f1.ls")).asJson().is("['foo','bar']");
 
 		System.clearProperty("A.f1.ls");
 		System.setProperty("A.f1", "['foo','bar']");
 		cp = ContextProperties.create().build();
-		assertObject(cp.get("A.f1.ls")).asJson().is("['foo','bar']");
+		assertOptional(cp.get("A.f1.ls")).asJson().is("['foo','bar']");
 
 		System.clearProperty("A.f1");
-		assertObject(cp.get("A.f1.ls")).isNull();
+		assertOptional(cp.get("A.f1.ls")).isNull();
 	}
 
 	@Test
@@ -1483,15 +1483,15 @@ public class ContextPropertiesTest {
 
 		System.setProperty("A.f1.li", "['2','1']");
 		ContextProperties cp = ContextProperties.create().build();
-		assertObject(cp.get("A.f1.li")).asJson().is("[2,1]");
+		assertOptional(cp.get("A.f1.li")).asJson().is("[2,1]");
 
 		System.clearProperty("A.f1.li");
 		System.setProperty("A.f1", "['2','1']");
 		cp = ContextProperties.create().build();
-		assertObject(cp.get("A.f1.li")).asJson().is("[2,1]");
+		assertOptional(cp.get("A.f1.li")).asJson().is("[2,1]");
 
 		System.clearProperty("A.f1");
-		assertObject(cp.get("A.f1.li")).isNull();
+		assertOptional(cp.get("A.f1.li")).isNull();
 	}
 
 	@Test
@@ -1499,15 +1499,15 @@ public class ContextPropertiesTest {
 
 		System.setProperty("A.f1.sms", "{foo:'bar',baz:null}");
 		ContextProperties cp = ContextProperties.create().build();
-		assertObject(cp.get("A.f1.sms")).asJson().is("{foo:'bar'}");
+		assertOptional(cp.get("A.f1.sms")).asJson().is("{foo:'bar'}");
 
 		System.clearProperty("A.f1.sms");
 		System.setProperty("A.f1", "{foo:'bar',baz:null}");
 		cp = ContextProperties.create().build();
-		assertObject(cp.get("A.f1.sms")).asJson().is("{foo:'bar'}");
+		assertOptional(cp.get("A.f1.sms")).asJson().is("{foo:'bar'}");
 
 		System.clearProperty("A.f1");
-		assertObject(cp.get("A.f1.sms")).isNull();
+		assertOptional(cp.get("A.f1.sms")).isNull();
 	}
 
 	@Test
@@ -1515,15 +1515,15 @@ public class ContextPropertiesTest {
 
 		System.setProperty("A.f1.smi", "{foo:'123',baz:null}");
 		ContextProperties cp = ContextProperties.create().build();
-		assertObject(cp.get("A.f1.smi")).asJson().is("{foo:123}");
+		assertOptional(cp.get("A.f1.smi")).asJson().is("{foo:123}");
 
 		System.clearProperty("A.f1.smi");
 		System.setProperty("A.f1", "{foo:'123',baz:null}");
 		cp = ContextProperties.create().build();
-		assertObject(cp.get("A.f1.smi")).asJson().is("{foo:123}");
+		assertOptional(cp.get("A.f1.smi")).asJson().is("{foo:123}");
 
 		System.clearProperty("A.f1");
-		assertObject(cp.get("A.f1.smi")).isNull();
+		assertOptional(cp.get("A.f1.smi")).isNull();
 	}
 
 	@Test
@@ -1531,15 +1531,15 @@ public class ContextPropertiesTest {
 
 		System.setProperty("A.f1.smo", "{foo:123,bar:'baz',qux:true,quux:null}");
 		ContextProperties cp = ContextProperties.create().build();
-		assertObject(cp.get("A.f1.smo")).asJson().is("{bar:'baz',foo:123,qux:true}");
+		assertOptional(cp.get("A.f1.smo")).asJson().is("{bar:'baz',foo:123,qux:true}");
 
 		System.clearProperty("A.f1.smo");
 		System.setProperty("A.f1", "{foo:123,bar:'baz',qux:true,quux:null}");
 		cp = ContextProperties.create().build();
-		assertObject(cp.get("A.f1.smo")).asJson().is("{bar:'baz',foo:123,qux:true}");
+		assertOptional(cp.get("A.f1.smo")).asJson().is("{bar:'baz',foo:123,qux:true}");
 
 		System.clearProperty("A.f1");
-		assertObject(cp.get("A.f1.smo")).isNull();
+		assertOptional(cp.get("A.f1.smo")).isNull();
 	}
 
 	//-------------------------------------------------------------------------------------------------------------------
@@ -1618,8 +1618,8 @@ public class ContextPropertiesTest {
 	@Test
 	public void testGetNonExistent() {
 		ContextProperties b = ContextProperties.create().set("A.foo", "bar").build();
-		assertObject(b.get("A.baz")).isNull();
-		assertObject(b.get("B.foo")).isNull();
+		assertOptional(b.get("A.baz")).isNull();
+		assertOptional(b.get("B.foo")).isNull();
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/Version_Test.java b/juneau-utest/src/test/java/org/apache/juneau/Version_Test.java
index eb362db..9848bff 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/Version_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/Version_Test.java
@@ -33,14 +33,14 @@ public class Version_Test {
 		assertObject(of("")).asString().is("0");
 
 		Version x = of("1.2.3");
-		assertInteger(x.getMajor()).is(1);
-		assertInteger(x.getMinor()).is(2);
-		assertInteger(x.getMaintenance()).is(3);
-		assertInteger(x.getPart(0)).is(1);
-		assertInteger(x.getPart(1)).is(2);
-		assertInteger(x.getPart(2)).is(3);
-		assertInteger(x.getPart(-1)).isNull();
-		assertInteger(x.getPart(3)).isNull();
+		assertInteger(x.getMajor().orElse(null)).is(1);
+		assertInteger(x.getMinor().orElse(null)).is(2);
+		assertInteger(x.getMaintenance().orElse(null)).is(3);
+		assertInteger(x.getPart(0).orElse(null)).is(1);
+		assertInteger(x.getPart(1).orElse(null)).is(2);
+		assertInteger(x.getPart(2).orElse(null)).is(3);
+		assertInteger(x.getPart(-1).orElse(null)).isNull();
+		assertInteger(x.getPart(3).orElse(null)).isNull();
 
 		x = of("1..x");
 		assertString(x).is("1.0.2147483647");
diff --git a/juneau-utest/src/test/java/org/apache/juneau/assertions/ArrayAssertion_Test.java b/juneau-utest/src/test/java/org/apache/juneau/assertions/ArrayAssertion_Test.java
index 3300274..09e1cf0 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/assertions/ArrayAssertion_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/assertions/ArrayAssertion_Test.java
@@ -13,8 +13,13 @@
 package org.apache.juneau.assertions;
 
 import static org.apache.juneau.assertions.Assertions.*;
+import static org.apache.juneau.assertions.AssertionPredicates.*;
 import static org.junit.runners.MethodSorters.*;
 
+import java.util.*;
+import java.util.function.*;
+
+import org.apache.juneau.testutils.pojos.*;
 import org.junit.*;
 
 @FixMethodOrder(NAME_ASCENDING)
@@ -24,6 +29,10 @@ public class ArrayAssertion_Test {
 		return assertArray(value).silent();
 	}
 
+	//-----------------------------------------------------------------------------------------------------------------
+	// Basic tests
+	//-----------------------------------------------------------------------------------------------------------------
+
 	@Test
 	public void a01_basic() throws Exception {
 		String[] x1={}, x2={"foo","bar"};
@@ -34,36 +43,170 @@ public class ArrayAssertion_Test {
 		test(null).doesNotExist();
 		assertThrown(()->test(x1).doesNotExist()).message().is("Value was not null.");
 
-		assertThrown(()->test(null).isSize(0)).message().is("Value was null.");
-		test(x1).isSize(0);
-		assertThrown(()->test(x1).isSize(2)).message().is("Array did not have the expected size.\n\tExpect=2.\n\tActual=0.");
-		test(x2).isSize(2);
-		assertThrown(()->test(x2).isSize(0)).message().is("Array did not have the expected size.\n\tExpect=0.\n\tActual=2.");
+		test(null).item(0).doesNotExist();
+		test(x1).item(0).doesNotExist();
+		test(x2).item(0).exists();
+
+	}
+
+	@Test
+	public void a02_other() throws Exception {
+		assertThrown(()->test(null).msg("Foo {0}", 1).exists()).message().is("Foo 1");
+		assertThrown(()->test(null).msg("Foo {0}", 1).throwable(RuntimeException.class).exists()).isExactType(RuntimeException.class).message().is("Foo 1");
+		test(null).stdout();
+	}
+
+	//-----------------------------------------------------------------------------------------------------------------
+	// Transform tests
+	//-----------------------------------------------------------------------------------------------------------------
+
+	@Test
+	public void b01_apply() throws Exception {
+		String[] x1={}, x2={"foo","bar"};
+		test(x1).apply(x -> x2).asJson().is("['foo','bar']");
+	}
+
+	@Test
+	public void b02_asString() throws Exception {
+		String[] x={"foo","bar"};
+		test(x).asString().is("[foo, bar]");
+		test(null).asString().isNull();
+	}
+
+	@Test
+	public void b03_asBeanList() throws Exception {
+		ABean[] x = new ABean[]{ABean.get(),ABean.get()};
+		test(x).asBeanList().property("a").asJson().is("[1,1]");
+		test(null).asBeanList().isNull();
+	}
+
+	@Test
+	public void b04_item() throws Exception {
+		ABean[] x = new ABean[]{ABean.get(),ABean.get()};
+		test(x).item(0).asBean().property("a").is(1);
+		test(x).item(-1).doesNotExist();
+		test(x).item(2).doesNotExist();
+		test((Object[])null).item(0).doesNotExist();
+	}
+
+	@Test
+	public void b05_sorted() throws Exception {
+		Integer[] x = new Integer[]{2,3,1};
+		test(x).sorted().asJson().is("[1,2,3]");
+		test(x).sorted(Comparator.reverseOrder()).asJson().is("[3,2,1]");
+		test(x).sorted(null).asJson().is("[1,2,3]");
+		test(null).sorted().isNull();
+	}
+
+	//-----------------------------------------------------------------------------------------------------------------
+	// Test tests
+	//-----------------------------------------------------------------------------------------------------------------
 
+	@Test
+	public void c01_any() throws Exception {
+		Integer[] x = new Integer[]{2,3,1};
+		test(x).any(y -> y .equals(3));
+		test(x).any(eq(3));
+		assertThrown(()->test(x).any(y -> y.equals(4))).message().is("Array did not contain any matching value.\n\tValue='[2, 3, 1]'.");
+		assertThrown(()->test(x).any(null)).message().is("Argument 'test' cannot be null.");
+	}
+
+	@Test
+	public void c02_all() throws Exception {
+		Integer[] x = new Integer[]{2,3,1};
+		test(x).all(y -> y < 4);
+		assertThrown(()->test(x).all(y -> y < 3)).message().is("Array contained non-matching value at index 1.\n\tUnexpected value: '3'.");
+		assertThrown(()->test(x).all(ne(3))).message().is("Array contained non-matching value at index 1.\n\tValue unexpectedly matched.\n\tValue='3'.");
+		assertThrown(()->test(x).all(null)).message().is("Argument 'test' cannot be null.");
+	}
+
+	@Test
+	public void c03_isEmpty() throws Exception {
+		String[] x1={}, x2={"foo","bar"};
 		assertThrown(()->test(null).isEmpty()).message().is("Value was null.");
 		test(x1).isEmpty();
 		assertThrown(()->test(x2).isEmpty()).message().is("Array was not empty.");
+	}
 
+	@Test
+	public void c04_isNotEmpty() throws Exception {
+		String[] x1={}, x2={"foo","bar"};
 		assertThrown(()->test(null).isNotEmpty()).message().is("Value was null.");
 		assertThrown(()->test(x1).isNotEmpty()).message().is("Array was empty.");
 		test(x2).isNotEmpty();
+	}
 
-		test(null).item(0).doesNotExist();
-		test(x1).item(0).doesNotExist();
-		test(x2).item(0).exists();
+	@Test
+	public void c05_isSize() throws Exception {
+		String[] x1={}, x2={"foo","bar"};
+		assertThrown(()->test(null).isSize(0)).message().is("Value was null.");
+		test(x1).isSize(0);
+		assertThrown(()->test(x1).isSize(2)).message().is("Array did not have the expected size.\n\tExpect=2.\n\tActual=0.");
+		test(x2).isSize(2);
+		assertThrown(()->test(x2).isSize(0)).message().is("Array did not have the expected size.\n\tExpect=0.\n\tActual=2.");
+	}
 
-		test(x2).contains("foo");
-		assertThrown(()->test(x2).contains("z")).message().is("Array did not contain expected value.\n\tExpect='z'.\n\tActual='[foo, bar]'.");
+	@Test
+	public void c06_contains() throws Exception {
+		String[] x1={null,"foo","bar"};
+		test(x1).contains("foo");
+		test(x1).contains((String)null);
+		assertThrown(()->test(x1).contains("z")).message().is("Array did not contain expected value.\n\tExpect='z'.\n\tActual='[null, foo, bar]'.");
+		test(x1).contains((Object)"foo");
+		test(x1).contains((Object)null);
+		assertThrown(()->test(x1).contains((Object)"z")).message().is("Array did not contain expected value.\n\tExpect='z'.\n\tActual='[null, foo, bar]'.");
 
-		test(x1).doesNotContain("foo");
-		assertThrown(()->test(x2).doesNotContain("foo")).message().is("Array contained unexpected value.\n\tUnexpected='foo'.\n\tActual='[foo, bar]'.");
-		assertThrown(()->test(x2).doesNotContain("bar")).message().is("Array contained unexpected value.\n\tUnexpected='bar'.\n\tActual='[foo, bar]'.");
+		Integer[] x2={null,1,2};
+		test(x2).contains("1");
+		assertThrown(()->test(x2).contains("3")).message().is("Array did not contain expected value.\n\tExpect='3'.\n\tActual='[null, 1, 2]'.");
+		test(x2).contains(1);
+		assertThrown(()->test(x2).contains(3)).message().is("Array did not contain expected value.\n\tExpect='3'.\n\tActual='[null, 1, 2]'.");
 	}
 
 	@Test
-	public void a02_other() throws Exception {
-		assertThrown(()->test(null).msg("Foo {0}", 1).exists()).message().is("Foo 1");
-		assertThrown(()->test(null).msg("Foo {0}", 1).throwable(RuntimeException.class).exists()).isExactType(RuntimeException.class).message().is("Foo 1");
-		test(null).stdout();
+	public void c07_doesNotContain() throws Exception {
+		String[] x1 = {null,"foo","bar"};
+		test(x1).doesNotContain("baz");
+		assertThrown(()->test(x1).doesNotContain("foo")).message().is("Array contained unexpected value.\n\tUnexpected='foo'.\n\tActual='[null, foo, bar]'.");
+		assertThrown(()->test(x1).doesNotContain((String)null)).message().is("Array contained unexpected value.\n\tUnexpected='null'.\n\tActual='[null, foo, bar]'.");
+		test(x1).doesNotContain((Object)"baz");
+		assertThrown(()->test(x1).doesNotContain((Object)"foo")).message().is("Array contained unexpected value.\n\tUnexpected='foo'.\n\tActual='[null, foo, bar]'.");
+		assertThrown(()->test(x1).doesNotContain((Object)null)).message().is("Array contained unexpected value.\n\tUnexpected='null'.\n\tActual='[null, foo, bar]'.");
+
+		Integer[] x2={null,1,2};
+		test(x2).doesNotContain("3");
+		assertThrown(()->test(x2).doesNotContain("1")).message().is("Array contained unexpected value.\n\tUnexpected='1'.\n\tActual='[null, 1, 2]'.");
+		test(x2).doesNotContain(3);
+		assertThrown(()->test(x2).doesNotContain(1)).message().is("Array contained unexpected value.\n\tUnexpected='1'.\n\tActual='[null, 1, 2]'.");
+	}
+
+	@Test
+	public void c08_equals() throws Exception {
+		String[] x1 = {null,"foo","bar"};
+		test(x1).equals(null,"foo","bar");
+		assertThrown(()->test(x1).equals(null,"foo","baz")).message().is("Array did not contain expected value at index 2.\n\tValue did not match expected.\n\tExpect='baz'.\n\tActual='bar'.");
+
+		Integer[] x2={null,1,2};
+		test(x2).equals(null,1,2);
+		test(x2).equals(null,"1","2");
+		assertThrown(()->test(x2).equals(null,1,3)).message().is("Array did not contain expected value at index 2.\n\tValue did not match expected.\n\tExpect='3'.\n\tActual='2'.");
+	}
+
+	@Test
+	public void c09_is() throws Exception {
+		String[] x1 = {null,"foo","bar"};
+		test(x1).is(null,"foo","bar");
+		assertThrown(()->test(x1).is(null,"foo","baz")).message().is("Array did not contain expected value at index 2.\n\tValue did not match expected.\n\tExpect='baz'.\n\tActual='bar'.");
+		test(x1).is(isNull(),eq("foo"),eq("bar"));
+		assertThrown(()->test(x1).is(isNull(),eq("foo"),eq("baz"))).message().is("Array did not contain expected value at index 2.\n\tValue did not match expected.\n\tExpect='baz'.\n\tActual='bar'.");
+		test(x1).is((Predicate<String>)null,null,null);
+
+		Integer[] x2={null,1,2};
+		test(x2).is(null,1,2);
+		test(x2).is(null,"1","2");
+		assertThrown(()->test(x2).is(null,1,3)).message().is("Array did not contain expected value at index 2.\n\tValue did not match expected.\n\tExpect='3'.\n\tActual='2'.");
+		test(x2).is(isNull(),eq(1),eq(2));
+		test(x2).is(null,eq("1"),eq("2"));
+		assertThrown(()->test(x2).is(isNull(),eq(1),eq(3))).message().is("Array did not contain expected value at index 2.\n\tValue did not match expected.\n\tExpect='3'.\n\tActual='2'.");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/assertions/AssertionPredicates_Test.java b/juneau-utest/src/test/java/org/apache/juneau/assertions/AssertionPredicates_Test.java
index a60704f..e5b6613 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/assertions/AssertionPredicates_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/assertions/AssertionPredicates_Test.java
@@ -154,4 +154,10 @@ public class AssertionPredicates_Test {
 		x1.passes(test(eq("foo")));
 		assertThrown(()->x1.passes(test(eq("bar")))).message().is("Value did not pass test.\n\tValue did not match expected.\n\tExpect='bar'.\n\tActual='foo'.");
 	}
+
+	@Test
+	public void a17_contains() {
+		x1.passes(test(contains("o")));
+		assertThrown(()->x1.passes(test(contains("x")))).message().is("Value did not pass test.\n\tValue did not contain expected.\n\tExpect='x'.\n\tActual='foo'.");
+	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/assertions/Assertion_Test.java b/juneau-utest/src/test/java/org/apache/juneau/assertions/Assertion_Test.java
index 2ab9040..14db787 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/assertions/Assertion_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/assertions/Assertion_Test.java
@@ -50,7 +50,7 @@ public class Assertion_Test {
 	}
 
 	@Test
-	public void a01_error() throws Exception {
+	public void a01_basicErrorHandling() throws Exception {
 		A a = new A("xxx");
 		a.silent();
 
diff --git a/juneau-utest/src/test/java/org/apache/juneau/assertions/Assertions_Test.java b/juneau-utest/src/test/java/org/apache/juneau/assertions/Assertions_Test.java
index 72eff7d..ffb329b 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/assertions/Assertions_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/assertions/Assertions_Test.java
@@ -19,67 +19,141 @@ import java.io.*;
 import java.time.*;
 import java.util.*;
 
+import org.apache.juneau.*;
 import org.apache.juneau.collections.*;
+import org.apache.juneau.testutils.pojos.*;
 import org.junit.*;
 
 @FixMethodOrder(NAME_ASCENDING)
 public class Assertions_Test {
 
 	@Test
-	public void a01_basic() throws Exception {
+	public void a00_basic() {
+		new Assertions();
+	}
 
+	@Test
+	public void a01_assertDate() throws Exception {
 		assertDate(new Date()).isAfter(new Date(0));
+	}
 
+	@Test
+	public void a02_assertInteger() throws Exception {
 		assertInteger(2).isGt(1);
+	}
 
+	@Test
+	public void a03_assertLong() throws Exception {
 		assertLong(2l).isGt(1l);
+	}
 
+	@Test
+	public void a04_assertObject() throws Exception {
 		assertObject("foo").asJson().is("'foo'");
+	}
 
+	@Test
+	public void a05_assertString() throws Exception {
 		assertString("foo").is("foo");
+	}
 
+	@Test
+	public void a06_assertThrowable() throws Exception {
 		assertThrowable(null).doesNotExist();
+	}
 
+	@Test
+	public void a07_assertArray() throws Exception {
 		assertArray(new String[0]).isEmpty();
+	}
 
+	@Test
+	public void a08_assertCollection() throws Exception {
 		assertCollection(AList.create()).isEmpty();
+	}
 
+	@Test
+	public void a09_assertList() throws Exception {
 		assertList(AList.create()).isEmpty();
+	}
 
+	@Test
+	public void a10_assertStream() throws Exception {
 		assertStream(new ByteArrayInputStream("foo".getBytes())).asString().is("foo");
 		assertStream((InputStream)null).asString().doesNotExist();
-		assertStream(Optional.of(new ByteArrayInputStream("foo".getBytes()))).asString().is("foo");
-		assertStream(Optional.empty()).asString().doesNotExist();
+	}
 
+	@Test
+	public void a11_assertBytes() throws Exception {
 		assertBytes("foo".getBytes()).asString().is("foo");
 		assertBytes((byte[])null).asString().doesNotExist();
-		assertBytes(Optional.of("foo".getBytes())).asString().is("foo");
-		assertBytes(Optional.empty()).asString().doesNotExist();
+	}
 
+	@Test
+	public void a12_assertReader() throws Exception {
 		assertReader(new StringReader("foo")).is("foo");
 		assertReader((Reader)null).doesNotExist();
-		assertReader(Optional.of(new StringReader("foo"))).is("foo");
-		assertReader(Optional.empty()).doesNotExist();
+	}
 
+	@Test
+	public void a13_assertThrown() throws Exception {
 		assertThrown(()->{throw new RuntimeException("foo");}).message().is("foo");
 		assertThrown(()->{}).doesNotExist();
+		assertThrown(StringIndexOutOfBoundsException.class, ()->"x".charAt(1)).message().is("String index out of range: 1");
+		assertThrown(
+			() ->assertThrown(StringIndexOutOfBoundsException.class, ()->{throw new RuntimeException();})
+		).message().is("Exception not of expected type.\n\tExpect='java.lang.StringIndexOutOfBoundsException'.\n\tActual='java.lang.RuntimeException'.");
+	}
 
+	@Test
+	public void a14_assertZonedDateTime() throws Exception {
 		assertZonedDateTime(ZonedDateTime.now()).exists();
-		assertZonedDateTime(Optional.of(ZonedDateTime.now())).exists();
+	}
 
+	@Test
+	public void a15_assertBean() throws Exception {
 		assertBean("123").exists();
-		assertBean(Optional.of("123")).exists();
+	}
 
+	@Test
+	public void a16_assertBoolean() throws Exception {
 		assertBoolean(true).isTrue();
-		assertBoolean(Optional.of(true)).isTrue();
+	}
 
-		new Assertions();
+	@Test
+	public void a17_assertVersion() throws Exception {
+		assertVersion(Version.of("2")).isGreaterThan(Version.of("1"));
+	}
+
+	@Test
+	public void a18_assertComparable() throws Exception {
+		assertComparable(2).isGreaterThan(1);
+	}
+
+	@Test
+	public void a19_assertBeanList() throws Exception {
+		assertBeanList(AList.of(ABean.get())).asJson().is("[{a:1,b:'foo'}]");
+	}
+
+	@Test
+	public void a20_assertPrimitiveArray() throws Exception {
+		assertPrimitiveArray(new int[]{1}).length().is(1);
+	}
+
+	@Test
+	public void a21_assertMap() throws Exception {
+		assertMap(AMap.of(1,2)).size().is(1);
+	}
+
+	@Test
+	public void a22_assertArgNotNull() throws Exception {
+		assertArgNotNull("foo", 123);
+		assertThrown(()->assertArgNotNull("foo", null)).message().is("Argument 'foo' cannot be null.");
 	}
 
 	@Test
-	public void a02_stdout_stderr() throws Exception {
-		assertThrown(()->assertObject(null).msg("Test message").stdout().exists()).exists();
-		assertThrown(()->assertObject(Optional.empty()).msg("Foo {0}", 1).throwable(RuntimeException.class).exists()).isExactType(RuntimeException.class).message().is("Foo 1");
-		assertObject(assertObject("foo").silent().error("test {0}", "message").getMessage()).is("test message");
+	public void a23_assertArg() throws Exception {
+		assertArg(true, "foo {0}", 1);
+		assertThrown(()->assertArg(false, "foo {0}", 1)).message().is("foo 1");
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/assertions/BooleanAssertion_Test.java b/juneau-utest/src/test/java/org/apache/juneau/assertions/BeanListAssertion_Test.java
similarity index 53%
copy from juneau-utest/src/test/java/org/apache/juneau/assertions/BooleanAssertion_Test.java
copy to juneau-utest/src/test/java/org/apache/juneau/assertions/BeanListAssertion_Test.java
index 4bbb25a..925cf48 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/assertions/BooleanAssertion_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/assertions/BeanListAssertion_Test.java
@@ -15,53 +15,58 @@ package org.apache.juneau.assertions;
 import static org.apache.juneau.assertions.Assertions.*;
 import static org.junit.runners.MethodSorters.*;
 
-import java.util.*;
-
-import static java.util.Optional.*;
-
+import org.apache.juneau.collections.*;
 import org.junit.*;
 
 @FixMethodOrder(NAME_ASCENDING)
-public class BooleanAssertion_Test {
+public class BeanListAssertion_Test {
 
-	private BooleanAssertion test(Boolean value) {
-		return assertBoolean(value).silent();
+	private BeanListAssertion<?> test(Object...value) {
+		return assertBeanList(value == null ? null : AList.of(value)).silent();
 	}
 
-	private BooleanAssertion test(Optional<Boolean> value) {
-		return assertBoolean(value).silent();
+	public static class A {
+		public Integer f1, f2;
+		public A() {}
+		public A(Integer f1, Integer f2) {
+			this.f1 = f1;
+			this.f2 = f2;
+		}
+		public static A of(Integer f1, Integer f2) {
+			return new A(f1, f2);
+		}
 	}
 
 	@Test
 	public void a01_basic() throws Exception {
+		A a = A.of(1,2);
 
-		assertThrown(()->test((Boolean)null).exists()).message().is("Value was null.");
-		test(true).exists();
-		assertThrown(()->test(empty()).exists()).message().is("Value was null.");
-		test(true).exists();
-
-		test(empty()).doesNotExist();
-		assertThrown(()->test(true).doesNotExist()).message().is("Value was not null.");
-
-		test(empty()).isEqual(null);
-		test(true).isEqual(true);
-		test(of(true)).isEqual(true);
-
-		test(true).isTrue();
-		assertThrown(()->test(true).isFalse()).message().is("Value was true.");
-		test(false).isFalse();
-		assertThrown(()->test(false).isTrue()).message().is("Value was false.");
+		assertThrown(()->test((Object[])null).exists()).message().is("Value was null.");
+		test(a).exists();
+	}
 
-		assertThrown(()->test(true).isEqual(false)).message().contains("Unexpected value.");
-		test(empty()).isEqual(null);
+	@Test
+	public void a02_extract() throws Exception {
+		A a1 = A.of(1,2), a2 = A.of(3,4);
+		test(a1, a2).extract("f1").asJson().is("[{f1:1},{f1:3}]");
+		test(a1, a2).extract("f1,f2").asJson().is("[{f1:1,f2:2},{f1:3,f2:4}]");
+		test(a1, a2).extract("f1","f2").asJson().is("[{f1:1,f2:2},{f1:3,f2:4}]");
+		test(a1, a2).extract("bad").asJson().is("[{},{}]");
+		test(a1, a2).extract((String)null).asJson().is("[{},{}]");
+	}
 
-		test(true).isNot("true");
+	@Test
+	public void a03_property() throws Exception {
+		A a1 = A.of(1,2), a2 = A.of(3,4);
+		test(a1, a2).property("f1").asJson().is("[1,3]");
+		test(a1, a2).property("bad").asJson().is("[null,null]");
+		test(a1, a2).property(null).asJson().is("[null,null]");
 	}
 
 	@Test
-	public void a02_other() throws Exception {
-		assertThrown(()->test((Boolean)null).msg("Foo {0}", 1).exists()).message().is("Foo 1");
-		assertThrown(()->test((Boolean)null).msg("Foo {0}", 1).throwable(RuntimeException.class).exists()).isExactType(RuntimeException.class).message().is("Foo 1");
-		test((Boolean)null).stdout();
+	public void b01_other() throws Exception {
+		assertThrown(()->test((Object[])null).msg("Foo {0}", 1).exists()).message().is("Foo 1");
+		assertThrown(()->test((Object[])null).msg("Foo {0}", 1).throwable(RuntimeException.class).exists()).isExactType(RuntimeException.class).message().is("Foo 1");
+		test((Object[])null).stdout();
 	}
 }
diff --git a/juneau-utest/src/test/java/org/apache/juneau/assertions/BooleanAssertion_Test.java b/juneau-utest/src/test/java/org/apache/juneau/assertions/BooleanAssertion_Test.java
index 4bbb25a..da8eab7 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/assertions/BooleanAssertion_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/assertions/BooleanAssertion_Test.java
@@ -15,10 +15,6 @@ package org.apache.juneau.assertions;
 import static org.apache.juneau.assertions.Assertions.*;
 import static org.junit.runners.MethodSorters.*;
 
-import java.util.*;
-
-import static java.util.Optional.*;
-
 import org.junit.*;
 
 @FixMethodOrder(NAME_ASCENDING)
@@ -28,24 +24,16 @@ public class BooleanAssertion_Test {
 		return assertBoolean(value).silent();
 	}
 
-	private BooleanAssertion test(Optional<Boolean> value) {
-		return assertBoolean(value).silent();
-	}
-
 	@Test
 	public void a01_basic() throws Exception {
 
 		assertThrown(()->test((Boolean)null).exists()).message().is("Value was null.");
 		test(true).exists();
-		assertThrown(()->test(empty()).exists()).message().is("Value was null.");
 		test(true).exists();
 
-		test(empty()).doesNotExist();
 		assertThrown(()->test(true).doesNotExist()).message().is("Value was not null.");
 
-		test(empty()).isEqual(null);
 		test(true).isEqual(true);
-		test(of(true)).isEqual(true);
 
 		test(true).isTrue();
 		assertThrown(()->test(true).isFalse()).message().is("Value was true.");
@@ -53,7 +41,6 @@ public class BooleanAssertion_Test {
 		assertThrown(()->test(false).isTrue()).message().is("Value was false.");
 
 		assertThrown(()->test(true).isEqual(false)).message().contains("Unexpected value.");
-		test(empty()).isEqual(null);
 
 		test(true).isNot("true");
 	}
diff --git a/juneau-utest/src/test/java/org/apache/juneau/assertions/ByteArrayAssertion_Test.java b/juneau-utest/src/test/java/org/apache/juneau/assertions/ByteArrayAssertion_Test.java
index cd5bae5..1e29248 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/assertions/ByteArrayAssertion_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/assertions/ByteArrayAssertion_Test.java
@@ -15,10 +15,6 @@ package org.apache.juneau.assertions;
 import static org.apache.juneau.assertions.Assertions.*;
 import static org.junit.runners.MethodSorters.*;
 
-import java.util.*;
-
-import static java.util.Optional.*;
-
 import org.junit.*;
 
 @FixMethodOrder(NAME_ASCENDING)
@@ -28,60 +24,45 @@ public class ByteArrayAssertion_Test {
 		return assertBytes(value).silent();
 	}
 
-	private ByteArrayAssertion test(Optional<byte[]> value) {
-		return assertBytes(value).silent();
-	}
-
 	@Test
 	public void a01_basic() throws Exception {
 		byte[] x1={}, x2={'a','b'};
 
 		assertThrown(()->test((byte[])null).exists()).message().is("Value was null.");
 		test(x1).exists();
-		assertThrown(()->test(empty()).exists()).message().is("Value was null.");
 		test(x1).exists();
 
 		test((byte[])null).doesNotExist();
 		assertThrown(()->test(x1).doesNotExist()).message().is("Value was not null.");
-		test(empty()).doesNotExist();
 		assertThrown(()->test(x1).doesNotExist()).message().is("Value was not null.");
 
-		assertThrown(()->test(empty()).isSize(0)).message().is("Value was null.");
-		test(x1).isSize(0);
+		test(x1).length().is(0);
 		assertThrown(()->test(x1).isSize(1)).message().is("Array did not have the expected size.\n\tExpect=1.\n\tActual=0.");
-		test(x2).isSize(2);
-		assertThrown(()->test(of(x1)).isSize(1)).message().is("Array did not have the expected size.\n\tExpect=1.\n\tActual=0.");
-		test(x2).isSize(2);
+		test(x2).length().is(2);
+		test(x2).length().is(2);
 		assertThrown(()->test(x2).isSize(0)).message().is("Array did not have the expected size.\n\tExpect=0.\n\tActual=2.");
 
-		assertThrown(()->test(empty()).isEmpty()).message().is("Value was null.");
 		test(x1).isEmpty();
 		assertThrown(()->test(x2).isEmpty()).message().is("Array was not empty.");
 
-		assertThrown(()->test(empty()).isNotEmpty()).message().is("Value was null.");
 		assertThrown(()->test(x1).isNotEmpty()).message().is("Array was empty.");
 		test(x2).isNotEmpty();
 
-		test(empty()).item(0).doesNotExist();
 		test(x1).item(0).doesNotExist();
 		test(x2).item(0).exists();
 
-		test(empty()).asString().isNull();
 		test(x1).asString().is("");
 		test(x2).asString().is("ab");
 		assertThrown(()->test(x2).asString().is("xx")).message().is("Unexpected value.\n\tExpect='xx'.\n\tActual='ab'.");
 
-		test(empty()).asBase64().isNull();
 		test(x1).asBase64().is("");
 		test(x2).asBase64().is("YWI=");
 		assertThrown(()->test(x2).asBase64().is("xx")).message().is("Unexpected value.\n\tExpect='xx'.\n\tActual='YWI='.");
 
-		test(empty()).asHex().isNull();
 		test(x1).asHex().is("");
 		test(x2).asHex().is("6162");
 		assertThrown(()->test(x2).asHex().is("xx")).message().is("Unexpected value.\n\tExpect='xx'.\n\tActual='6162'.");
 
-		test(empty()).asSpacedHex().isNull();
 		test(x1).asSpacedHex().is("");
 		test(x2).asSpacedHex().is("61 62");
 		assertThrown(()->test(x2).asSpacedHex().is("xx")).message().is("Unexpected value.\n\tExpect='xx'.\n\tActual='61 62'.");
diff --git a/juneau-utest/src/test/java/org/apache/juneau/assertions/DateAssertion_Test.java b/juneau-utest/src/test/java/org/apache/juneau/assertions/DateAssertion_Test.java
index 7fa68af..231454c 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/assertions/DateAssertion_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/assertions/DateAssertion_Test.java
@@ -14,8 +14,6 @@ package org.apache.juneau.assertions;
 
 import static org.apache.juneau.assertions.Assertions.*;
 import static org.junit.runners.MethodSorters.*;
-import static java.util.Optional.*;
-
 import java.time.temporal.*;
 import java.util.*;
 
@@ -28,52 +26,38 @@ public class DateAssertion_Test {
 		return assertDate(value).silent();
 	}
 
-	private DateAssertion test(Optional<Date> value) {
-		return assertDate(value).silent();
-	}
-
 	@Test
 	public void a01_basic() throws Exception {
 		Date x1 = new Date(0), x2 = new Date(Long.MAX_VALUE), now = new Date();
 
 		assertThrown(()->test((Date)null).exists()).message().is("Value was null.");
 		test(x1).exists();
-		assertThrown(()->test(empty()).exists()).message().is("Value was null.");
 		test(x1).exists();
 
-		test(empty()).doesNotExist();
 		assertThrown(()->test(x1).doesNotExist()).message().is("Value was not null.");
 
-		test(empty()).isEqual(null);
 		test(x1).isEqual(x1);
-		test(of(x1)).isEqual(x1);
 		test(x1).isEqual(x1, ChronoUnit.DAYS);
 		assertThrown(()->test(x2).isEqual(x1, ChronoUnit.DAYS)).message().contains("Unexpected value.");
 
-		test(empty()).isEqual(null);
 		test(x1).isEqual(x1);
 		test(x1).isEqual(x1, ChronoUnit.DAYS);
 		assertThrown(()->test(x2).isEqual(x1, ChronoUnit.DAYS)).message().contains("Unexpected value.");
 
-		assertThrown(()->test(empty()).isBefore(x1)).message().is("Value was null.");
 		assertThrown(()->test(x1).isBefore(null)).message().is("Argument 'value' cannot be null.");
 		test(x1).isBefore(x2);
 		assertThrown(()->test(x2).isBefore(x1)).message().contains("Value was not before expected.");
 
-		assertThrown(()->test(empty()).isAfter(x1)).message().is("Value was null.");
 		assertThrown(()->test(x1).isAfter(null)).message().is("Argument 'value' cannot be null.");
 		test(x2).isAfter(x1);
 		assertThrown(()->test(x1).isAfter(x2)).message().contains("Value was not after expected.");
 
-		assertThrown(()->test(empty()).isBeforeNow()).message().is("Value was null.");
 		test(x1).isBeforeNow();
 		assertThrown(()->test(x2).isBeforeNow()).message().contains("Value was not before expected.");
 
-		assertThrown(()->test(empty()).isAfterNow()).message().is("Value was null.");
 		test(x2).isAfterNow();
 		assertThrown(()->test(x1).isAfterNow()).message().contains("Value was not after expected.");
 
-		assertThrown(()->test(empty()).isBetween(x1,x2)).message().is("Value was null.");
 		assertThrown(()->test(now).isBetween(null,x2)).message().is("Argument 'lower' cannot be null.");
 		assertThrown(()->test(now).isBetween(x1,null)).message().is("Argument 'upper' cannot be null.");
 		test(now).isBetween(x1, x2);
diff --git a/juneau-utest/src/test/java/org/apache/juneau/assertions/IntegerAssertion_Test.java b/juneau-utest/src/test/java/org/apache/juneau/assertions/IntegerAssertion_Test.java
index 8b8df5b..54f6c59 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/assertions/IntegerAssertion_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/assertions/IntegerAssertion_Test.java
@@ -15,10 +15,6 @@ package org.apache.juneau.assertions;
 import static org.apache.juneau.assertions.Assertions.*;
 import static org.junit.runners.MethodSorters.*;
 
-import java.util.*;
-
-import static java.util.Optional.*;
-
 import org.junit.*;
 
 @FixMethodOrder(NAME_ASCENDING)
@@ -28,77 +24,59 @@ public class IntegerAssertion_Test {
 		return assertInteger(value).silent();
 	}
 
-	private IntegerAssertion test(Optional<Integer> value) {
-		return assertInteger(value).silent();
-	}
-
 	@Test
 	public void a01_basic() throws Exception {
 
 		assertThrown(()->test((Integer)null).exists()).message().is("Value was null.");
 		test(1).exists();
-		assertThrown(()->test(empty()).exists()).message().is("Value was null.");
 		test(1).exists();
 
-		test(empty()).doesNotExist();
 		assertThrown(()->test(1).doesNotExist()).message().is("Value was not null.");
 
-		test(empty()).isEqual(null);
 		test(1).isEqual(1);
-		test(of(1)).isEqual(1);
 
 		assertThrown(()->test(1).isEqual(2)).message().contains("Unexpected value.");
-		test(empty()).isEqual(null);
 
-		assertThrown(()->test(empty()).isGreaterThan(1)).message().is("Value was null.");
 		assertThrown(()->test(1).isGreaterThan(null)).message().is("Argument 'value' cannot be null.");
 		test(2).isGreaterThan(1);
 		assertThrown(()->test(1).isGreaterThan(2)).message().is("Value was not greater than expected.\n\tExpect='2'.\n\tActual='1'.");
 		assertThrown(()->test(1).isGreaterThan(1)).message().is("Value was not greater than expected.\n\tExpect='1'.\n\tActual='1'.");
 
-		assertThrown(()->test(empty()).isGt(1)).message().is("Value was null.");
 		assertThrown(()->test(1).isGt(null)).message().is("Argument 'value' cannot be null.");
 		test(2).isGt(1);
 		assertThrown(()->test(1).isGt(2)).message().is("Value was not greater than expected.\n\tExpect='2'.\n\tActual='1'.");
 		assertThrown(()->test(1).isGt(1)).message().is("Value was not greater than expected.\n\tExpect='1'.\n\tActual='1'.");
 
-		assertThrown(()->test(empty()).isGreaterThanOrEqual(1)).message().is("Value was null.");
 		assertThrown(()->test(1).isGreaterThanOrEqual(null)).message().is("Argument 'value' cannot be null.");
 		test(2).isGreaterThanOrEqual(1);
 		assertThrown(()->test(1).isGreaterThanOrEqual(2)).message().is("Value was not greater than or equals to expected.\n\tExpect='2'.\n\tActual='1'.");
 		test(1).isGreaterThanOrEqual(1);
 
-		assertThrown(()->test(empty()).isGte(1)).message().is("Value was null.");
 		assertThrown(()->test(1).isGte(null)).message().is("Argument 'value' cannot be null.");
 		test(2).isGte(1);
 		assertThrown(()->test(1).isGte(2)).message().is("Value was not greater than or equals to expected.\n\tExpect='2'.\n\tActual='1'.");
 		test(1).isGte(1);
 
-		assertThrown(()->test(empty()).isLessThan(1)).message().is("Value was null.");
 		assertThrown(()->test(1).isLessThan(null)).message().is("Argument 'value' cannot be null.");
 		test(1).isLessThan(2);
 		assertThrown(()->test(2).isLessThan(1)).message().is("Value was not less than expected.\n\tExpect='1'.\n\tActual='2'.");
 		assertThrown(()->test(1).isLessThan(1)).message().is("Value was not less than expected.\n\tExpect='1'.\n\tActual='1'.");
 
-		assertThrown(()->test(empty()).isLt(1)).message().is("Value was null.");
 		assertThrown(()->test(1).isLt(null)).message().is("Argument 'value' cannot be null.");
 		test(1).isLt(2);
 		assertThrown(()->test(2).isLt(1)).message().is("Value was not less than expected.\n\tExpect='1'.\n\tActual='2'.");
 		assertThrown(()->test(1).isLt(1)).message().is("Value was not less than expected.\n\tExpect='1'.\n\tActual='1'.");
 
-		assertThrown(()->test(empty()).isLessThanOrEqual(1)).message().is("Value was null.");
 		assertThrown(()->test(1).isLessThanOrEqual(null)).message().is("Argument 'value' cannot be null.");
 		test(1).isLessThanOrEqual(2);
 		assertThrown(()->test(2).isLessThanOrEqual(1)).message().is("Value was not less than or equals to expected.\n\tExpect='1'.\n\tActual='2'.");
 		test(1).isLessThanOrEqual(1);
 
-		assertThrown(()->test(empty()).isLte(1)).message().is("Value was null.");
 		assertThrown(()->test(1).isLte(null)).message().is("Argument 'value' cannot be null.");
 		test(1).isLte(2);
 		assertThrown(()->test(2).isLte(1)).message().is("Value was not less than or equals to expected.\n\tExpect='1'.\n\tActual='2'.");
 		test(1).isLte(1);
 
-		assertThrown(()->test(empty()).isBetween(1,3)).message().is("Value was null.");
 		assertThrown(()->test(2).isBetween(null,3)).message().is("Argument 'lower' cannot be null.");
 		assertThrown(()->test(2).isBetween(1,null)).message().is("Argument 'upper' cannot be null.");
 		test(2).isBetween(1,3);
diff --git a/juneau-utest/src/test/java/org/apache/juneau/assertions/LongAssertion_Test.java b/juneau-utest/src/test/java/org/apache/juneau/assertions/LongAssertion_Test.java
index 7e3fd92..ee676ff 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/assertions/LongAssertion_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/assertions/LongAssertion_Test.java
@@ -15,10 +15,6 @@ package org.apache.juneau.assertions;
 import static org.apache.juneau.assertions.Assertions.*;
 import static org.junit.runners.MethodSorters.*;
 
-import java.util.*;
-
-import static java.util.Optional.*;
-
 import org.junit.*;
 
 @FixMethodOrder(NAME_ASCENDING)
@@ -28,80 +24,61 @@ public class LongAssertion_Test {
 		return assertLong(value).silent();
 	}
 
-	private LongAssertion test(Optional<Long> value) {
-		return assertLong(value).silent();
-	}
-
 	@Test
 	public void a01_basic() throws Exception {
 
 		assertThrown(()->test((Long)null).exists()).message().is("Value was null.");
 		test(1l).exists();
-		assertThrown(()->test(empty()).exists()).message().is("Value was null.");
 		test(1l).exists();
 
-		test(empty()).doesNotExist();
 		assertThrown(()->test(1l).doesNotExist()).message().is("Value was not null.");
 
-		test(empty()).isEqual(null);
-		test(of(1l)).isEqual(1l);
 		test(1l).isEqual(1l);
 
 		assertThrown(()->test(1l).isEqual(2)).message().contains("Unexpected value.");
-		test(empty()).isEqual(null);
 
-		assertThrown(()->test(empty()).isGreaterThan(1)).message().is("Value was null.");
 		assertThrown(()->test(1l).isGreaterThan(null)).message().is("Argument 'value' cannot be null.");
 		test(2l).isGreaterThan(1);
 		assertThrown(()->test(1l).isGreaterThan(2l)).message().is("Value was not greater than expected.\n\tExpect='2'.\n\tActual='1'.");
 		assertThrown(()->test(1l).isGreaterThan(1l)).message().is("Value was not greater than expected.\n\tExpect='1'.\n\tActual='1'.");
 
 		test(2l).asInteger().isGreaterThan(1);
-		test(empty()).asInteger().isNull();
 
-		assertThrown(()->test(empty()).isGt(1l)).message().is("Value was null.");
 		assertThrown(()->test(1l).isGt(null)).message().is("Argument 'value' cannot be null.");
 		test(2l).isGt(1);
 		assertThrown(()->test(1l).isGt(2)).message().is("Value was not greater than expected.\n\tExpect='2'.\n\tActual='1'.");
 		assertThrown(()->test(1l).isGt(1)).message().is("Value was not greater than expected.\n\tExpect='1'.\n\tActual='1'.");
 
-		assertThrown(()->test(empty()).isGreaterThanOrEqual(1)).message().is("Value was null.");
 		assertThrown(()->test(1l).isGreaterThanOrEqual(null)).message().is("Argument 'value' cannot be null.");
 		test(2l).isGreaterThanOrEqual(1);
 		assertThrown(()->test(1l).isGreaterThanOrEqual(2)).message().is("Value was not greater than or equals to expected.\n\tExpect='2'.\n\tActual='1'.");
 		test(1l).isGreaterThanOrEqual(1);
 
-		assertThrown(()->test(empty()).isGte(1)).message().is("Value was null.");
 		assertThrown(()->test(1l).isGte(null)).message().is("Argument 'value' cannot be null.");
 		test(2l).isGte(1);
 		assertThrown(()->test(1l).isGte(2l)).message().is("Value was not greater than or equals to expected.\n\tExpect='2'.\n\tActual='1'.");
 		test(1l).isGte(1l);
 
-		assertThrown(()->test(empty()).isLessThan(1)).message().is("Value was null.");
 		assertThrown(()->test(1l).isLessThan(null)).message().is("Argument 'value' cannot be null.");
 		test(1l).isLessThan(2l);
 		assertThrown(()->test(2l).isLessThan(1)).message().is("Value was not less than expected.\n\tExpect='1'.\n\tActual='2'.");
 		assertThrown(()->test(1l).isLessThan(1)).message().is("Value was not less than expected.\n\tExpect='1'.\n\tActual='1'.");
 
-		assertThrown(()->test(empty()).isLt(1)).message().is("Value was null.");
 		assertThrown(()->test(1l).isLt(null)).message().is("Argument 'value' cannot be null.");
 		test(1l).isLt(2);
 		assertThrown(()->test(2l).isLt(1)).message().is("Value was not less than expected.\n\tExpect='1'.\n\tActual='2'.");
 		assertThrown(()->test(1l).isLt(1)).message().is("Value was not less than expected.\n\tExpect='1'.\n\tActual='1'.");
 
-		assertThrown(()->test(empty()).isLessThanOrEqual(1)).message().is("Value was null.");
 		assertThrown(()->test(1l).isLessThanOrEqual(null)).message().is("Argument 'value' cannot be null.");
 		test(1l).isLessThanOrEqual(2);
 		assertThrown(()->test(2l).isLessThanOrEqual(1)).message().is("Value was not less than or equals to expected.\n\tExpect='1'.\n\tActual='2'.");
 		test(1l).isLessThanOrEqual(1);
 
-		assertThrown(()->test(empty()).isLte(1)).message().is("Value was null.");
 		assertThrown(()->test(1l).isLte(null)).message().is("Argument 'value' cannot be null.");
 		test(1l).isLte(2);
 		assertThrown(()->test(2l).isLte(1)).message().is("Value was not less than or equals to expected.\n\tExpect='1'.\n\tActual='2'.");
 		test(1l).isLte(1);
 
-		assertThrown(()->test(empty()).isBetween(1,3)).message().is("Value was null.");
 		assertThrown(()->test(2l).isBetween(null,3)).message().is("Argument 'lower' cannot be null.");
 		assertThrown(()->test(2l).isBetween(1,null)).message().is("Argument 'upper' cannot be null.");
 		test(2l).isBetween(1,3);
diff --git a/juneau-utest/src/test/java/org/apache/juneau/assertions/ObjectAssertion_Test.java b/juneau-utest/src/test/java/org/apache/juneau/assertions/ObjectAssertion_Test.java
index f06142b..a232bb5 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/assertions/ObjectAssertion_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/assertions/ObjectAssertion_Test.java
@@ -15,7 +15,6 @@ package org.apache.juneau.assertions;
 import static org.apache.juneau.assertions.AssertionPredicates.*;
 import static org.apache.juneau.assertions.Assertions.*;
 import static org.junit.runners.MethodSorters.*;
-import static java.util.Optional.*;
 
 import java.time.*;
 import java.util.*;
@@ -31,10 +30,6 @@ public class ObjectAssertion_Test {
 		return assertObject(value).silent();
 	}
 
-	private <T> ObjectAssertion<T> test(Optional<T> value) {
-		return assertObject(value).silent();
-	}
-
 	public static class A1 {
 		public int getFoo() {
 			throw new RuntimeException("foo");
@@ -53,11 +48,8 @@ public class ObjectAssertion_Test {
 	@Test
 	public void a01_basic() throws Exception {
 		test((Object)null).doesNotExist();
-		test(empty()).doesNotExist();
 		test(1).exists();
-		test(of(1)).exists();
 
-		assertThrown(()->test(empty()).isType(String.class)).message().is("Value was null.");
 		assertThrown(()->test("foo").isType(null)).message().is("Argument 'parent' cannot be null.");
 		test("foo").isType(String.class);
 		test("foo").isType(CharSequence.class);
@@ -65,35 +57,28 @@ public class ObjectAssertion_Test {
 		assertThrown(()->test(1).isType(String.class)).message().is("Unexpected type.\n\tExpect='java.lang.String'.\n\tActual='java.lang.Integer'.");
 
 		test("foo").asString(JsonSerializer.DEFAULT).is("\"foo\"");
-		test(empty()).asString(JsonSerializer.DEFAULT).is("null");
 
 		assertThrown(()->test(new A1()).asJson()).messages().any(contains("Could not call getValue() on property 'foo'"));
 
 		test("foo").asJson().is("'foo'");
-		test(empty()).asString(JsonSerializer.DEFAULT).is("null");
 
 		test(new A2()).asJsonSorted().is("{bar:2,foo:1}");
 
 		int[] x1 = {1,2}, x2 = {2,1};
 		test(x2).asJsonSorted().is("[1,2]");
 		assertThrown(()->test(x2).asJsonSorted().is("[2,1]")).message().is("Unexpected value.\n\tExpect='[2,1]'.\n\tActual='[1,2]'.");
-		test(empty()).asJsonSorted().is("null");
 
 		test(x1).isSameJsonAs(x1);
 		assertThrown(()->test(x1).isSameJsonAs(x2)).message().is("Unexpected comparison.\n\tExpect='[2,1]'.\n\tActual='[1,2]'.");
-		test(empty()).isSameJsonAs(null);
 		assertThrown(()->test(new A1()).isSameJsonAs(null)).messages().any(contains("Could not call getValue() on property 'foo'"));
 
 		test(x1).isSameSortedAs(x1);
 		test(x1).isSameSortedAs(x2);
 		assertThrown(()->test(x1).isSameJsonAs(null)).message().is("Unexpected comparison.\n\tExpect='null'.\n\tActual='[1,2]'.");
-		test(empty()).isSameSortedAs(null);
 
 		test(x1).doesNotEqual(null);
-		test(empty()).doesNotEqual(x1);
 		test(x1).doesNotEqual(x2);
 
-		assertThrown(()->test(empty()).doesNotEqual(null)).message().is("Unexpected value.\n\tDid not expect='null'.\n\tActual='null'.");
 		assertThrown(()->test(x1).doesNotEqual(x1)).message().is("Unexpected value.\n\tDid not expect='[1, 2]'.\n\tActual='[1, 2]'.");
 
 		test(x1).passes(x->x != null);
diff --git a/juneau-utest/src/test/java/org/apache/juneau/assertions/VersionAssertion_Test.java b/juneau-utest/src/test/java/org/apache/juneau/assertions/VersionAssertion_Test.java
index a869198..6c6ed2d 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/assertions/VersionAssertion_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/assertions/VersionAssertion_Test.java
@@ -16,8 +16,6 @@ import static org.apache.juneau.assertions.Assertions.*;
 import static org.apache.juneau.Version.*;
 import static org.junit.runners.MethodSorters.*;
 
-import java.util.*;
-
 import static java.util.Optional.*;
 
 import org.apache.juneau.*;
@@ -30,76 +28,58 @@ public class VersionAssertion_Test {
 		return assertVersion(value).silent();
 	}
 
-	private VersionAssertion test(Optional<Version> value) {
-		return assertVersion(value).silent();
-	}
-
 	@Test
 	public void a01_basic() throws Exception {
 
 		assertThrown(()->test((Version)null).exists()).message().is("Value was null.");
 		test(of("1")).exists();
-		assertThrown(()->test(empty()).exists()).message().is("Value was null.");
 		test(of("1")).exists();
 
-		test(empty()).doesNotExist();
 		assertThrown(()->test(of("1")).doesNotExist()).message().is("Value was not null.");
 
-		test(empty()).isEqual(null);
-		test(Optional.of(of("1"))).isEqual(of("1"));
 
 		assertThrown(()->test(of("1")).isEqual(of("2"))).message().contains("Unexpected value.");
-		test(empty()).isEqual(null);
 
-		assertThrown(()->test(empty()).isGreaterThan(of("1"))).message().is("Value was null.");
 		assertThrown(()->test(of("1")).isGreaterThan(null)).message().is("Argument 'value' cannot be null.");
 		test(of("2")).isGreaterThan(of("1"));
 		assertThrown(()->test(of("1")).isGreaterThan(of("2"))).message().is("Value was not greater than expected.\n\tExpect='2'.\n\tActual='1'.");
 		assertThrown(()->test(of("1")).isGreaterThan(of("1"))).message().is("Value was not greater than expected.\n\tExpect='1'.\n\tActual='1'.");
 
-		assertThrown(()->test(empty()).isGt(of("1"))).message().is("Value was null.");
 		assertThrown(()->test(of("1")).isGt(null)).message().is("Argument 'value' cannot be null.");
 		test(of("2")).isGt(of("1"));
 		assertThrown(()->test(of("1")).isGt(of("2"))).message().is("Value was not greater than expected.\n\tExpect='2'.\n\tActual='1'.");
 		assertThrown(()->test(of("1")).isGt(of("1"))).message().is("Value was not greater than expected.\n\tExpect='1'.\n\tActual='1'.");
 
-		assertThrown(()->test(empty()).isGreaterThanOrEqual(of("1"))).message().is("Value was null.");
 		assertThrown(()->test(of("1")).isGreaterThanOrEqual(null)).message().is("Argument 'value' cannot be null.");
 		test(of("2")).isGreaterThanOrEqual(of("1"));
 		assertThrown(()->test(of("1")).isGreaterThanOrEqual(of("2"))).message().is("Value was not greater than or equals to expected.\n\tExpect='2'.\n\tActual='1'.");
 		test(of("1")).isGreaterThanOrEqual(of("1"));
 
-		assertThrown(()->test(empty()).isGte(of("1"))).message().is("Value was null.");
 		assertThrown(()->test(of("1")).isGte(null)).message().is("Argument 'value' cannot be null.");
 		test(of("2")).isGte(of("1"));
 		assertThrown(()->test(of("1")).isGte(of("2"))).message().is("Value was not greater than or equals to expected.\n\tExpect='2'.\n\tActual='1'.");
 		test(of("1")).isGte(of("1"));
 
-		assertThrown(()->test(empty()).isLessThan(of("1"))).message().is("Value was null.");
 		assertThrown(()->test(of("1")).isLessThan(null)).message().is("Argument 'value' cannot be null.");
 		test(of("1")).isLessThan(of("2"));
 		assertThrown(()->test(of("2")).isLessThan(of("1"))).message().is("Value was not less than expected.\n\tExpect='1'.\n\tActual='2'.");
 		assertThrown(()->test(of("1")).isLessThan(of("1"))).message().is("Value was not less than expected.\n\tExpect='1'.\n\tActual='1'.");
 
-		assertThrown(()->test(empty()).isLt(of("1"))).message().is("Value was null.");
 		assertThrown(()->test(of("1")).isLt(null)).message().is("Argument 'value' cannot be null.");
 		test(of("1")).isLt(of("2"));
 		assertThrown(()->test(of("2")).isLt(of("1"))).message().is("Value was not less than expected.\n\tExpect='1'.\n\tActual='2'.");
 		assertThrown(()->test(of("1")).isLt(of("1"))).message().is("Value was not less than expected.\n\tExpect='1'.\n\tActual='1'.");
 
-		assertThrown(()->test(empty()).isLessThanOrEqual(of("1"))).message().is("Value was null.");
 		assertThrown(()->test(of("1")).isLessThanOrEqual(null)).message().is("Argument 'value' cannot be null.");
 		test(of("1")).isLessThanOrEqual(of("2"));
 		assertThrown(()->test(of("2")).isLessThanOrEqual(of("1"))).message().is("Value was not less than or equals to expected.\n\tExpect='1'.\n\tActual='2'.");
 		test(of("1")).isLessThanOrEqual(of("1"));
 
-		assertThrown(()->test(empty()).isLte(of("1"))).message().is("Value was null.");
 		assertThrown(()->test(of("1")).isLte(null)).message().is("Argument 'value' cannot be null.");
 		test(of("1")).isLte(of("2"));
 		assertThrown(()->test(of("2")).isLte(of("1"))).message().is("Value was not less than or equals to expected.\n\tExpect='1'.\n\tActual='2'.");
 		test(of("1")).isLte(of("1"));
 
-		assertThrown(()->test(empty()).isBetween(of("1"),of("3"))).message().is("Value was null.");
 		assertThrown(()->test(of("2")).isBetween(null,of("3"))).message().is("Argument 'lower' cannot be null.");
 		assertThrown(()->test(of("2")).isBetween(of("1"),null)).message().is("Argument 'upper' cannot be null.");
 		test(of("2")).isBetween(of("1"),of("3"));
diff --git a/juneau-utest/src/test/java/org/apache/juneau/assertions/ZonedDateTimeAssertion_Test.java b/juneau-utest/src/test/java/org/apache/juneau/assertions/ZonedDateTimeAssertion_Test.java
index fde0eb8..cff3732 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/assertions/ZonedDateTimeAssertion_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/assertions/ZonedDateTimeAssertion_Test.java
@@ -14,12 +14,8 @@ package org.apache.juneau.assertions;
 
 import static org.apache.juneau.assertions.Assertions.*;
 import static org.junit.runners.MethodSorters.*;
-import static java.util.Optional.*;
-
 import java.time.*;
 import java.time.temporal.*;
-import java.util.*;
-
 import org.junit.*;
 
 @FixMethodOrder(NAME_ASCENDING)
@@ -29,10 +25,6 @@ public class ZonedDateTimeAssertion_Test {
 		return assertZonedDateTime(value).silent();
 	}
 
-	private ZonedDateTimeAssertion test(Optional<ZonedDateTime> value) {
-		return assertZonedDateTime(value).silent();
-	}
-
 	@Test
 	public void a01_basic() throws Exception {
 		ZonedDateTime x1 = ZonedDateTime.parse("1950-01-01T12:34:56Z"), x2 = ZonedDateTime.parse("2050-01-01T12:34:56Z");
@@ -40,42 +32,32 @@ public class ZonedDateTimeAssertion_Test {
 
 		assertThrown(()->test((ZonedDateTime)null).exists()).message().is("Value was null.");
 		test(x1).exists();
-		assertThrown(()->test(empty()).exists()).message().is("Value was null.");
 		test(x1).exists();
 
-		test(empty()).doesNotExist();
 		assertThrown(()->test(x1).doesNotExist()).message().is("Value was not null.");
 
-		test(empty()).isEqual(null);
 		test(x1).isEqual(x1);
-		test(of(x1)).isEqual(x1);
 		test(x1).isEqual(x1, ChronoUnit.DAYS);
 		assertThrown(()->test(x2).isEqual(x1, ChronoUnit.DAYS)).message().contains("Unexpected value.");
 
-		test(empty()).isEqual(null);
 		test(x1).isEqual(x1);
 		test(x1).isEqual(x1, ChronoUnit.DAYS);
 		assertThrown(()->test(x2).isEqual(x1, ChronoUnit.DAYS)).message().contains("Unexpected value.");
 
-		assertThrown(()->test(empty()).isBefore(x1)).message().is("Value was null.");
 		assertThrown(()->test(x1).isBefore(null)).message().is("Argument 'value' cannot be null.");
 		test(x1).isBefore(x2);
 		assertThrown(()->test(x2).isBefore(x1)).message().contains("Value was not before expected.");
 
-		assertThrown(()->test(empty()).isAfter(x1)).message().is("Value was null.");
 		assertThrown(()->test(x1).isAfter(null)).message().is("Argument 'value' cannot be null.");
 		test(x2).isAfter(x1);
 		assertThrown(()->test(x1).isAfter(x2)).message().contains("Value was not after expected.");
 
-		assertThrown(()->test(empty()).isBeforeNow()).message().is("Value was null.");
 		test(x1).isBeforeNow();
 		assertThrown(()->test(x2).isBeforeNow()).message().contains("Value was not before expected.");
 
-		assertThrown(()->test(empty()).isAfterNow()).message().is("Value was null.");
 		test(x2).isAfterNow();
 		assertThrown(()->test(x1).isAfterNow()).message().contains("Value was not after expected.");
 
-		assertThrown(()->test(empty()).isBetween(x1,x2)).message().is("Value was null.");
 		assertThrown(()->test(now).isBetween(null,x2)).message().is("Argument 'lower' cannot be null.");
 		assertThrown(()->test(now).isBetween(x1,null)).message().is("Argument 'upper' cannot be null.");
 		test(now).isBetween(x1, x2);
diff --git a/juneau-utest/src/test/java/org/apache/juneau/cp/BeanStore_Test.java b/juneau-utest/src/test/java/org/apache/juneau/cp/BeanStore_Test.java
index 54458b7..d1c9213 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/cp/BeanStore_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/cp/BeanStore_Test.java
@@ -37,13 +37,13 @@ public class BeanStore_Test {
 	public void a01_addBean() {
 		BeanStore bs = new BeanStore();
 		assertBoolean(bs.hasBean(A.class)).isFalse();
-		assertObject(bs.getBean(A.class)).doesNotExist();
+		assertOptional(bs.getBean(A.class)).doesNotExist();
 		bs.addBean(A.class, new A());
 		assertBoolean(bs.hasBean(A.class)).isTrue();
-		assertObject(bs.getBean(A.class)).exists();
+		assertOptional(bs.getBean(A.class)).exists();
 		bs = BeanStore.of(bs);
 		assertBoolean(bs.hasBean(A.class)).isTrue();
-		assertObject(bs.getBean(A.class)).exists();
+		assertOptional(bs.getBean(A.class)).exists();
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
diff --git a/juneau-utest/src/test/java/org/apache/juneau/cp/FileFinder_Test.java b/juneau-utest/src/test/java/org/apache/juneau/cp/FileFinder_Test.java
index c0e951b..abc42be 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/cp/FileFinder_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/cp/FileFinder_Test.java
@@ -15,6 +15,7 @@ package org.apache.juneau.cp;
 import static org.apache.juneau.assertions.Assertions.*;
 import static org.junit.runners.MethodSorters.*;
 
+import java.io.*;
 import java.nio.file.*;
 import java.util.*;
 
@@ -28,6 +29,14 @@ import org.junit.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class FileFinder_Test {
 
+	private InputStream stream(FileFinder ff, String path) throws Exception {
+		return ff.getStream(path).orElse(null);
+	}
+
+	private InputStream stream(FileFinder ff, String path, Locale locale) throws Exception {
+		return ff.getStream(path, locale).orElse(null);
+	}
+
 	//-----------------------------------------------------------------------------------------------------------------
 	// Basic tests.
 	//-----------------------------------------------------------------------------------------------------------------
@@ -38,7 +47,7 @@ public class FileFinder_Test {
 			.create()
 			.build();
 
-		assertStream(x.getStream("files/test1a")).asString().doesNotExist();
+		assertStream(stream(x,"files/test1a")).asString().doesNotExist();
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -55,18 +64,18 @@ public class FileFinder_Test {
 		String[] patterns = {"_a.txt","_b",".c",".d.txt","e.txt","f","g_foo.txt","h.foo.txt","i_foo"};
 
 		for (String p : patterns) {
-			assertStream(x.getStream("files/test1/"+p)).asString().contains("[home:/files/test1/"+p+"]");
-			assertStream(x.getStream("files/test1/dir/"+p)).asString().contains("[home:/files/test1/dir/"+p+"]");
-			assertStream(x.getStream("files/test1/dir/dir/"+p)).asString().contains("[home:/files/test1/dir/dir/"+p+"]");
-			assertStream(x.getStream(" / files/test1/"+p+" / ")).asString().contains("[home:/files/test1/"+p+"]");
-			assertStream(x.getStream(" / files/test1/dir/"+p+" / ")).asString().contains("[home:/files/test1/dir/"+p+"]");
-			assertStream(x.getStream(" / files/test1/dir/dir/"+p+" / ")).asString().contains("[home:/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x,"files/test1/"+p)).asString().contains("[home:/files/test1/"+p+"]");
+			assertStream(stream(x,"files/test1/dir/"+p)).asString().contains("[home:/files/test1/dir/"+p+"]");
+			assertStream(stream(x,"files/test1/dir/dir/"+p)).asString().contains("[home:/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x," / files/test1/"+p+" / ")).asString().contains("[home:/files/test1/"+p+"]");
+			assertStream(stream(x," / files/test1/dir/"+p+" / ")).asString().contains("[home:/files/test1/dir/"+p+"]");
+			assertStream(stream(x," / files/test1/dir/dir/"+p+" / ")).asString().contains("[home:/files/test1/dir/dir/"+p+"]");
 		}
 
 		String[] badPatterns = {"files/test1/bad.txt","files/test1/../test1/_a.txt","files/test1/%2E%2E/test1/_a.txt","files/bad.txt",null,"",".","..","%2E","%2E%2E","j.class","k.properties"};
 
 		for (String p : badPatterns) {
-			assertStream(x.getStream(p)).doesNotExist();
+			assertStream(stream(x,p)).doesNotExist();
 		}
 	}
 
@@ -80,18 +89,18 @@ public class FileFinder_Test {
 		String[] patterns = {"_a.txt","_b",".c",".d.txt","e.txt","f","g_foo.txt","h.foo.txt","i_foo"};
 
 		for (String p : patterns) {
-			assertStream(x.getStream("test1/"+p)).asString().contains("[home:/files/test1/"+p+"]");
-			assertStream(x.getStream("test1/dir/"+p)).asString().contains("[home:/files/test1/dir/"+p+"]");
-			assertStream(x.getStream("test1/dir/dir/"+p)).asString().contains("[home:/files/test1/dir/dir/"+p+"]");
-			assertStream(x.getStream("/test1/"+p+"/")).asString().contains("[home:/files/test1/"+p+"]");
-			assertStream(x.getStream("/test1/dir/"+p+"/")).asString().contains("[home:/files/test1/dir/"+p+"]");
-			assertStream(x.getStream("/test1/dir/dir/"+p+"/")).asString().contains("[home:/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x,"test1/"+p)).asString().contains("[home:/files/test1/"+p+"]");
+			assertStream(stream(x,"test1/dir/"+p)).asString().contains("[home:/files/test1/dir/"+p+"]");
+			assertStream(stream(x,"test1/dir/dir/"+p)).asString().contains("[home:/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x,"/test1/"+p+"/")).asString().contains("[home:/files/test1/"+p+"]");
+			assertStream(stream(x,"/test1/dir/"+p+"/")).asString().contains("[home:/files/test1/dir/"+p+"]");
+			assertStream(stream(x,"/test1/dir/dir/"+p+"/")).asString().contains("[home:/files/test1/dir/dir/"+p+"]");
 		}
 
 		String[] badPatterns = {"test1/bad.txt","test1/../test1/_a.txt","bad.txt",null,"",".",".."};
 
 		for (String p : badPatterns) {
-			assertStream(x.getStream(p)).doesNotExist();
+			assertStream(stream(x,p)).doesNotExist();
 		}
 	}
 
@@ -109,34 +118,34 @@ public class FileFinder_Test {
 		for (int i = 0; i < patterns.length; i++) {
 			String p = patterns[i], p_ja = patterns_ja[i], p_ja_JP = patterns_ja_JP[i];
 
-			assertStream(x.getStream("test1/"+p,null)).asString().contains("[home:/files/test1/"+p+"]");
-			assertStream(x.getStream("test1/dir/"+p,null)).asString().contains("[home:/files/test1/dir/"+p+"]");
-			assertStream(x.getStream("test1/dir/dir/"+p,null)).asString().contains("[home:/files/test1/dir/dir/"+p+"]");
-			assertStream(x.getStream("/test1/"+p+"/",null)).asString().contains("[home:/files/test1/"+p+"]");
-			assertStream(x.getStream("/test1/dir/"+p+"/",null)).asString().contains("[home:/files/test1/dir/"+p+"]");
-			assertStream(x.getStream("/test1/dir/dir/"+p+"/",null)).asString().contains("[home:/files/test1/dir/dir/"+p+"]");
-
-			assertStream(x.getStream("test1/"+p,JAPANESE)).asString().contains("[home:/files/test1/"+p_ja+"]");
-			assertStream(x.getStream("test1/dir/"+p,JAPANESE)).asString().contains("[home:/files/test1/dir/"+p_ja+"]");
-			assertStream(x.getStream("test1/dir/dir/"+p,JAPANESE)).asString().contains("[home:/files/test1/dir/dir/"+p_ja+"]");
-			assertStream(x.getStream("/test1/"+p+"/",JAPANESE)).asString().contains("[home:/files/test1/"+p_ja+"]");
-			assertStream(x.getStream("/test1/dir/"+p+"/",JAPANESE)).asString().contains("[home:/files/test1/dir/"+p_ja+"]");
-			assertStream(x.getStream("/test1/dir/dir/"+p+"/",JAPANESE)).asString().contains("[home:/files/test1/dir/dir/"+p_ja+"]");
-
-			assertStream(x.getStream("test1/"+p,JAPAN)).asString().contains("[home:/files/test1/"+p_ja_JP+"]");
-			assertStream(x.getStream("test1/dir/"+p,JAPAN)).asString().contains("[home:/files/test1/dir/"+p_ja_JP+"]");
-			assertStream(x.getStream("test1/dir/dir/"+p,JAPAN)).asString().contains("[home:/files/test1/dir/dir/"+p_ja_JP+"]");
-			assertStream(x.getStream("/test1/"+p+"/",JAPAN)).asString().contains("[home:/files/test1/"+p_ja_JP+"]");
-			assertStream(x.getStream("/test1/dir/"+p+"/",JAPAN)).asString().contains("[home:/files/test1/dir/"+p_ja_JP+"]");
-			assertStream(x.getStream("/test1/dir/dir/"+p+"/",JAPAN)).asString().contains("[home:/files/test1/dir/dir/"+p_ja_JP+"]");
+			assertStream(stream(x,"test1/"+p,null)).asString().contains("[home:/files/test1/"+p+"]");
+			assertStream(stream(x,"test1/dir/"+p,null)).asString().contains("[home:/files/test1/dir/"+p+"]");
+			assertStream(stream(x,"test1/dir/dir/"+p,null)).asString().contains("[home:/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x,"/test1/"+p+"/",null)).asString().contains("[home:/files/test1/"+p+"]");
+			assertStream(stream(x,"/test1/dir/"+p+"/",null)).asString().contains("[home:/files/test1/dir/"+p+"]");
+			assertStream(stream(x,"/test1/dir/dir/"+p+"/",null)).asString().contains("[home:/files/test1/dir/dir/"+p+"]");
+
+			assertStream(stream(x,"test1/"+p,JAPANESE)).asString().contains("[home:/files/test1/"+p_ja+"]");
+			assertStream(stream(x,"test1/dir/"+p,JAPANESE)).asString().contains("[home:/files/test1/dir/"+p_ja+"]");
+			assertStream(stream(x,"test1/dir/dir/"+p,JAPANESE)).asString().contains("[home:/files/test1/dir/dir/"+p_ja+"]");
+			assertStream(stream(x,"/test1/"+p+"/",JAPANESE)).asString().contains("[home:/files/test1/"+p_ja+"]");
+			assertStream(stream(x,"/test1/dir/"+p+"/",JAPANESE)).asString().contains("[home:/files/test1/dir/"+p_ja+"]");
+			assertStream(stream(x,"/test1/dir/dir/"+p+"/",JAPANESE)).asString().contains("[home:/files/test1/dir/dir/"+p_ja+"]");
+
+			assertStream(stream(x,"test1/"+p,JAPAN)).asString().contains("[home:/files/test1/"+p_ja_JP+"]");
+			assertStream(stream(x,"test1/dir/"+p,JAPAN)).asString().contains("[home:/files/test1/dir/"+p_ja_JP+"]");
+			assertStream(stream(x,"test1/dir/dir/"+p,JAPAN)).asString().contains("[home:/files/test1/dir/dir/"+p_ja_JP+"]");
+			assertStream(stream(x,"/test1/"+p+"/",JAPAN)).asString().contains("[home:/files/test1/"+p_ja_JP+"]");
+			assertStream(stream(x,"/test1/dir/"+p+"/",JAPAN)).asString().contains("[home:/files/test1/dir/"+p_ja_JP+"]");
+			assertStream(stream(x,"/test1/dir/dir/"+p+"/",JAPAN)).asString().contains("[home:/files/test1/dir/dir/"+p_ja_JP+"]");
 		}
 
 		String[] badPatterns = {"test1/bad.txt","test1/../test1/_a.txt","bad.txt",null,"",".","..","j.class","k.properties"};
 
 		for (String p : badPatterns) {
-			assertStream(x.getStream(p,null)).doesNotExist();
-			assertStream(x.getStream(p,JAPANESE)).doesNotExist();
-			assertStream(x.getStream(p,JAPAN)).doesNotExist();
+			assertStream(stream(x,p,null)).doesNotExist();
+			assertStream(stream(x,p,JAPANESE)).doesNotExist();
+			assertStream(stream(x,p,JAPAN)).doesNotExist();
 		}
 	}
 
@@ -147,26 +156,26 @@ public class FileFinder_Test {
 			.dir("files/test2")
 			.build();
 
-		assertStream(x.getStream("a.txt", null)).asString().contains("[home:/files/test2/a.txt]");
-		assertStream(x.getStream("a.txt", JAPANESE)).asString().contains("[home:/files/test2/ja/a.txt]");
-		assertStream(x.getStream("a.txt", JAPAN)).asString().contains("[home:/files/test2/ja/JP/a.txt]");
-		assertStream(x.getStream("/a.txt/", null)).asString().contains("[home:/files/test2/a.txt]");
-		assertStream(x.getStream("/a.txt/", JAPANESE)).asString().contains("[home:/files/test2/ja/a.txt]");
-		assertStream(x.getStream("/a.txt/", JAPAN)).asString().contains("[home:/files/test2/ja/JP/a.txt]");
-
-		assertStream(x.getStream("dir/a.txt", null)).asString().contains("[home:/files/test2/dir/a.txt]");
-		assertStream(x.getStream("dir/a.txt", JAPANESE)).asString().contains("[home:/files/test2/ja/dir/a.txt]");
-		assertStream(x.getStream("dir/a.txt", JAPAN)).asString().contains("[home:/files/test2/ja/JP/dir/a.txt]");
-		assertStream(x.getStream("/dir/a.txt/", null)).asString().contains("[home:/files/test2/dir/a.txt]");
-		assertStream(x.getStream("/dir/a.txt/", JAPANESE)).asString().contains("[home:/files/test2/ja/dir/a.txt]");
-		assertStream(x.getStream("/dir/a.txt/", JAPAN)).asString().contains("[home:/files/test2/ja/JP/dir/a.txt]");
-
-		assertStream(x.getStream("dir/dir/a.txt", null)).asString().contains("[home:/files/test2/dir/dir/a.txt]");
-		assertStream(x.getStream("dir/dir/a.txt", JAPANESE)).asString().contains("[home:/files/test2/ja/dir/dir/a.txt]");
-		assertStream(x.getStream("dir/dir/a.txt", JAPAN)).asString().contains("[home:/files/test2/ja/JP/dir/dir/a.txt]");
-		assertStream(x.getStream("/dir/dir/a.txt/", null)).asString().contains("[home:/files/test2/dir/dir/a.txt]");
-		assertStream(x.getStream("/dir/dir/a.txt/", JAPANESE)).asString().contains("[home:/files/test2/ja/dir/dir/a.txt]");
-		assertStream(x.getStream("/dir/dir/a.txt/", JAPAN)).asString().contains("[home:/files/test2/ja/JP/dir/dir/a.txt]");
+		assertStream(stream(x,"a.txt", null)).asString().contains("[home:/files/test2/a.txt]");
+		assertStream(stream(x,"a.txt", JAPANESE)).asString().contains("[home:/files/test2/ja/a.txt]");
+		assertStream(stream(x,"a.txt", JAPAN)).asString().contains("[home:/files/test2/ja/JP/a.txt]");
+		assertStream(stream(x,"/a.txt/", null)).asString().contains("[home:/files/test2/a.txt]");
+		assertStream(stream(x,"/a.txt/", JAPANESE)).asString().contains("[home:/files/test2/ja/a.txt]");
+		assertStream(stream(x,"/a.txt/", JAPAN)).asString().contains("[home:/files/test2/ja/JP/a.txt]");
+
+		assertStream(stream(x,"dir/a.txt", null)).asString().contains("[home:/files/test2/dir/a.txt]");
+		assertStream(stream(x,"dir/a.txt", JAPANESE)).asString().contains("[home:/files/test2/ja/dir/a.txt]");
+		assertStream(stream(x,"dir/a.txt", JAPAN)).asString().contains("[home:/files/test2/ja/JP/dir/a.txt]");
+		assertStream(stream(x,"/dir/a.txt/", null)).asString().contains("[home:/files/test2/dir/a.txt]");
+		assertStream(stream(x,"/dir/a.txt/", JAPANESE)).asString().contains("[home:/files/test2/ja/dir/a.txt]");
+		assertStream(stream(x,"/dir/a.txt/", JAPAN)).asString().contains("[home:/files/test2/ja/JP/dir/a.txt]");
+
+		assertStream(stream(x,"dir/dir/a.txt", null)).asString().contains("[home:/files/test2/dir/dir/a.txt]");
+		assertStream(stream(x,"dir/dir/a.txt", JAPANESE)).asString().contains("[home:/files/test2/ja/dir/dir/a.txt]");
+		assertStream(stream(x,"dir/dir/a.txt", JAPAN)).asString().contains("[home:/files/test2/ja/JP/dir/dir/a.txt]");
+		assertStream(stream(x,"/dir/dir/a.txt/", null)).asString().contains("[home:/files/test2/dir/dir/a.txt]");
+		assertStream(stream(x,"/dir/dir/a.txt/", JAPANESE)).asString().contains("[home:/files/test2/ja/dir/dir/a.txt]");
+		assertStream(stream(x,"/dir/dir/a.txt/", JAPAN)).asString().contains("[home:/files/test2/ja/JP/dir/dir/a.txt]");
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -183,18 +192,18 @@ public class FileFinder_Test {
 		String[] patterns = {"_a.txt","_b",".c",".d.txt","e.txt","f","g_foo.txt","h.foo.txt","i_foo"};
 
 		for (String p : patterns) {
-			assertStream(x.getStream("files/test1/"+p)).asString().contains("[cp:/files/test1/"+p+"]");
-			assertStream(x.getStream("files/test1/dir/"+p)).asString().contains("[cp:/files/test1/dir/"+p+"]");
-			assertStream(x.getStream("files/test1/dir/dir/"+p)).asString().contains("[cp:/files/test1/dir/dir/"+p+"]");
-			assertStream(x.getStream(" / files/test1/"+p+" / ")).asString().contains("[cp:/files/test1/"+p+"]");
-			assertStream(x.getStream(" / files/test1/dir/"+p+" / ")).asString().contains("[cp:/files/test1/dir/"+p+"]");
-			assertStream(x.getStream(" / files/test1/dir/dir/"+p+" / ")).asString().contains("[cp:/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x,"files/test1/"+p)).asString().contains("[cp:/files/test1/"+p+"]");
+			assertStream(stream(x,"files/test1/dir/"+p)).asString().contains("[cp:/files/test1/dir/"+p+"]");
+			assertStream(stream(x,"files/test1/dir/dir/"+p)).asString().contains("[cp:/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x," / files/test1/"+p+" / ")).asString().contains("[cp:/files/test1/"+p+"]");
+			assertStream(stream(x," / files/test1/dir/"+p+" / ")).asString().contains("[cp:/files/test1/dir/"+p+"]");
+			assertStream(stream(x," / files/test1/dir/dir/"+p+" / ")).asString().contains("[cp:/files/test1/dir/dir/"+p+"]");
 		}
 
 		String[] badPatterns = {"files/test1/bad.txt","files/test1/../test1/_a.txt","files/bad.txt",null,"",".","..","LocalizedFileStore_Test.class"};
 
 		for (String p : badPatterns) {
-			assertStream(x.getStream(p)).msg("pattern=[{0}]", p).doesNotExist();
+			assertStream(stream(x,p)).msg("pattern=[{0}]", p).doesNotExist();
 		}
 	}
 
@@ -208,18 +217,18 @@ public class FileFinder_Test {
 		String[] patterns = {"_a.txt","_b",".c",".d.txt","e.txt","f","g_foo.txt","h.foo.txt","i_foo"};
 
 		for (String p : patterns) {
-			assertStream(x.getStream("test1/"+p)).asString().contains("[cp:/files/test1/"+p+"]");
-			assertStream(x.getStream("test1/dir/"+p)).asString().contains("[cp:/files/test1/dir/"+p+"]");
-			assertStream(x.getStream("test1/dir/dir/"+p)).asString().contains("[cp:/files/test1/dir/dir/"+p+"]");
-			assertStream(x.getStream(" / test1/"+p+" / ")).asString().contains("[cp:/files/test1/"+p+"]");
-			assertStream(x.getStream(" / test1/dir/"+p+" / ")).asString().contains("[cp:/files/test1/dir/"+p+"]");
-			assertStream(x.getStream(" / test1/dir/dir/"+p+" / ")).asString().contains("[cp:/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x,"test1/"+p)).asString().contains("[cp:/files/test1/"+p+"]");
+			assertStream(stream(x,"test1/dir/"+p)).asString().contains("[cp:/files/test1/dir/"+p+"]");
+			assertStream(stream(x,"test1/dir/dir/"+p)).asString().contains("[cp:/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x," / test1/"+p+" / ")).asString().contains("[cp:/files/test1/"+p+"]");
+			assertStream(stream(x," / test1/dir/"+p+" / ")).asString().contains("[cp:/files/test1/dir/"+p+"]");
+			assertStream(stream(x," / test1/dir/dir/"+p+" / ")).asString().contains("[cp:/files/test1/dir/dir/"+p+"]");
 		}
 
 		String[] badPatterns = {"files/test1/bad.txt","files/test1/../test1/_a.txt","files/bad.txt",null,"",".",".."};
 
 		for (String p : badPatterns) {
-			assertStream(x.getStream(p)).doesNotExist();
+			assertStream(stream(x,p)).doesNotExist();
 		}
 	}
 
@@ -238,34 +247,34 @@ public class FileFinder_Test {
 		for (int i = 0; i < patterns.length; i++) {
 			String p = patterns[i], p_ja = patterns_ja[i], p_ja_JP = patterns_ja_JP[i];
 
-			assertStream(x.getStream("test1/"+p,null)).asString().contains("[cp:/files/test1/"+p+"]");
-			assertStream(x.getStream("test1/dir/"+p,null)).asString().contains("[cp:/files/test1/dir/"+p+"]");
-			assertStream(x.getStream("test1/dir/dir/"+p,null)).asString().contains("[cp:/files/test1/dir/dir/"+p+"]");
-			assertStream(x.getStream("/test1/"+p+"/",null)).asString().contains("[cp:/files/test1/"+p+"]");
-			assertStream(x.getStream("/test1/dir/"+p+"/",null)).asString().contains("[cp:/files/test1/dir/"+p+"]");
-			assertStream(x.getStream("/test1/dir/dir/"+p+"/",null)).asString().contains("[cp:/files/test1/dir/dir/"+p+"]");
-
-			assertStream(x.getStream("test1/"+p,JAPANESE)).asString().contains("[cp:/files/test1/"+p_ja+"]");
-			assertStream(x.getStream("test1/dir/"+p,JAPANESE)).asString().contains("[cp:/files/test1/dir/"+p_ja+"]");
-			assertStream(x.getStream("test1/dir/dir/"+p,JAPANESE)).asString().contains("[cp:/files/test1/dir/dir/"+p_ja+"]");
-			assertStream(x.getStream("/test1/"+p+"/",JAPANESE)).asString().contains("[cp:/files/test1/"+p_ja+"]");
-			assertStream(x.getStream("/test1/dir/"+p+"/",JAPANESE)).asString().contains("[cp:/files/test1/dir/"+p_ja+"]");
-			assertStream(x.getStream("/test1/dir/dir/"+p+"/",JAPANESE)).asString().contains("[cp:/files/test1/dir/dir/"+p_ja+"]");
-
-			assertStream(x.getStream("test1/"+p,JAPAN)).asString().contains("[cp:/files/test1/"+p_ja_JP+"]");
-			assertStream(x.getStream("test1/dir/"+p,JAPAN)).asString().contains("[cp:/files/test1/dir/"+p_ja_JP+"]");
-			assertStream(x.getStream("test1/dir/dir/"+p,JAPAN)).asString().contains("[cp:/files/test1/dir/dir/"+p_ja_JP+"]");
-			assertStream(x.getStream("/test1/"+p+"/",JAPAN)).asString().contains("[cp:/files/test1/"+p_ja_JP+"]");
-			assertStream(x.getStream("/test1/dir/"+p+"/",JAPAN)).asString().contains("[cp:/files/test1/dir/"+p_ja_JP+"]");
-			assertStream(x.getStream("/test1/dir/dir/"+p+"/",JAPAN)).asString().contains("[cp:/files/test1/dir/dir/"+p_ja_JP+"]");
+			assertStream(stream(x,"test1/"+p,null)).asString().contains("[cp:/files/test1/"+p+"]");
+			assertStream(stream(x,"test1/dir/"+p,null)).asString().contains("[cp:/files/test1/dir/"+p+"]");
+			assertStream(stream(x,"test1/dir/dir/"+p,null)).asString().contains("[cp:/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x,"/test1/"+p+"/",null)).asString().contains("[cp:/files/test1/"+p+"]");
+			assertStream(stream(x,"/test1/dir/"+p+"/",null)).asString().contains("[cp:/files/test1/dir/"+p+"]");
+			assertStream(stream(x,"/test1/dir/dir/"+p+"/",null)).asString().contains("[cp:/files/test1/dir/dir/"+p+"]");
+
+			assertStream(stream(x,"test1/"+p,JAPANESE)).asString().contains("[cp:/files/test1/"+p_ja+"]");
+			assertStream(stream(x,"test1/dir/"+p,JAPANESE)).asString().contains("[cp:/files/test1/dir/"+p_ja+"]");
+			assertStream(stream(x,"test1/dir/dir/"+p,JAPANESE)).asString().contains("[cp:/files/test1/dir/dir/"+p_ja+"]");
+			assertStream(stream(x,"/test1/"+p+"/",JAPANESE)).asString().contains("[cp:/files/test1/"+p_ja+"]");
+			assertStream(stream(x,"/test1/dir/"+p+"/",JAPANESE)).asString().contains("[cp:/files/test1/dir/"+p_ja+"]");
+			assertStream(stream(x,"/test1/dir/dir/"+p+"/",JAPANESE)).asString().contains("[cp:/files/test1/dir/dir/"+p_ja+"]");
+
+			assertStream(stream(x,"test1/"+p,JAPAN)).asString().contains("[cp:/files/test1/"+p_ja_JP+"]");
+			assertStream(stream(x,"test1/dir/"+p,JAPAN)).asString().contains("[cp:/files/test1/dir/"+p_ja_JP+"]");
+			assertStream(stream(x,"test1/dir/dir/"+p,JAPAN)).asString().contains("[cp:/files/test1/dir/dir/"+p_ja_JP+"]");
+			assertStream(stream(x,"/test1/"+p+"/",JAPAN)).asString().contains("[cp:/files/test1/"+p_ja_JP+"]");
+			assertStream(stream(x,"/test1/dir/"+p+"/",JAPAN)).asString().contains("[cp:/files/test1/dir/"+p_ja_JP+"]");
+			assertStream(stream(x,"/test1/dir/dir/"+p+"/",JAPAN)).asString().contains("[cp:/files/test1/dir/dir/"+p_ja_JP+"]");
 		}
 
 		String[] badPatterns = {"test1/bad.txt","test1/../test1/_a.txt","bad.txt",null,"",".",".."};
 
 		for (String p : badPatterns) {
-			assertStream(x.getStream(p,null)).doesNotExist();
-			assertStream(x.getStream(p,JAPANESE)).doesNotExist();
-			assertStream(x.getStream(p,JAPAN)).doesNotExist();
+			assertStream(stream(x,p,null)).doesNotExist();
+			assertStream(stream(x,p,JAPANESE)).doesNotExist();
+			assertStream(stream(x,p,JAPAN)).doesNotExist();
 		}
 	}
 
@@ -277,26 +286,26 @@ public class FileFinder_Test {
 			.cp(FileFinder_Test.class, "/files/test2", false)
 			.build();
 
-		assertStream(x.getStream("a.txt", null)).asString().contains("[cp:/files/test2/a.txt]");
-		assertStream(x.getStream("a.txt", JAPANESE)).asString().contains("[cp:/files/test2/ja/a.txt]");
-		assertStream(x.getStream("a.txt", JAPAN)).asString().contains("[cp:/files/test2/ja/JP/a.txt]");
-		assertStream(x.getStream("/a.txt/", null)).asString().contains("[cp:/files/test2/a.txt]");
-		assertStream(x.getStream("/a.txt/", JAPANESE)).asString().contains("[cp:/files/test2/ja/a.txt]");
-		assertStream(x.getStream("/a.txt/", JAPAN)).asString().contains("[cp:/files/test2/ja/JP/a.txt]");
-
-		assertStream(x.getStream("dir/a.txt", null)).asString().contains("[cp:/files/test2/dir/a.txt]");
-		assertStream(x.getStream("dir/a.txt", JAPANESE)).asString().contains("[cp:/files/test2/ja/dir/a.txt]");
-		assertStream(x.getStream("dir/a.txt", JAPAN)).asString().contains("[cp:/files/test2/ja/JP/dir/a.txt]");
-		assertStream(x.getStream("/dir/a.txt/", null)).asString().contains("[cp:/files/test2/dir/a.txt]");
-		assertStream(x.getStream("/dir/a.txt/", JAPANESE)).asString().contains("[cp:/files/test2/ja/dir/a.txt]");
-		assertStream(x.getStream("/dir/a.txt/", JAPAN)).asString().contains("[cp:/files/test2/ja/JP/dir/a.txt]");
-
-		assertStream(x.getStream("dir/dir/a.txt", null)).asString().contains("[cp:/files/test2/dir/dir/a.txt]");
-		assertStream(x.getStream("dir/dir/a.txt", JAPANESE)).asString().contains("[cp:/files/test2/ja/dir/dir/a.txt]");
-		assertStream(x.getStream("dir/dir/a.txt", JAPAN)).asString().contains("[cp:/files/test2/ja/JP/dir/dir/a.txt]");
-		assertStream(x.getStream("/dir/dir/a.txt/", null)).asString().contains("[cp:/files/test2/dir/dir/a.txt]");
-		assertStream(x.getStream("/dir/dir/a.txt/", JAPANESE)).asString().contains("[cp:/files/test2/ja/dir/dir/a.txt]");
-		assertStream(x.getStream("/dir/dir/a.txt/", JAPAN)).asString().contains("[cp:/files/test2/ja/JP/dir/dir/a.txt]");
+		assertStream(stream(x,"a.txt", null)).asString().contains("[cp:/files/test2/a.txt]");
+		assertStream(stream(x,"a.txt", JAPANESE)).asString().contains("[cp:/files/test2/ja/a.txt]");
+		assertStream(stream(x,"a.txt", JAPAN)).asString().contains("[cp:/files/test2/ja/JP/a.txt]");
+		assertStream(stream(x,"/a.txt/", null)).asString().contains("[cp:/files/test2/a.txt]");
+		assertStream(stream(x,"/a.txt/", JAPANESE)).asString().contains("[cp:/files/test2/ja/a.txt]");
+		assertStream(stream(x,"/a.txt/", JAPAN)).asString().contains("[cp:/files/test2/ja/JP/a.txt]");
+
+		assertStream(stream(x,"dir/a.txt", null)).asString().contains("[cp:/files/test2/dir/a.txt]");
+		assertStream(stream(x,"dir/a.txt", JAPANESE)).asString().contains("[cp:/files/test2/ja/dir/a.txt]");
+		assertStream(stream(x,"dir/a.txt", JAPAN)).asString().contains("[cp:/files/test2/ja/JP/dir/a.txt]");
+		assertStream(stream(x,"/dir/a.txt/", null)).asString().contains("[cp:/files/test2/dir/a.txt]");
+		assertStream(stream(x,"/dir/a.txt/", JAPANESE)).asString().contains("[cp:/files/test2/ja/dir/a.txt]");
+		assertStream(stream(x,"/dir/a.txt/", JAPAN)).asString().contains("[cp:/files/test2/ja/JP/dir/a.txt]");
+
+		assertStream(stream(x,"dir/dir/a.txt", null)).asString().contains("[cp:/files/test2/dir/dir/a.txt]");
+		assertStream(stream(x,"dir/dir/a.txt", JAPANESE)).asString().contains("[cp:/files/test2/ja/dir/dir/a.txt]");
+		assertStream(stream(x,"dir/dir/a.txt", JAPAN)).asString().contains("[cp:/files/test2/ja/JP/dir/dir/a.txt]");
+		assertStream(stream(x,"/dir/dir/a.txt/", null)).asString().contains("[cp:/files/test2/dir/dir/a.txt]");
+		assertStream(stream(x,"/dir/dir/a.txt/", JAPANESE)).asString().contains("[cp:/files/test2/ja/dir/dir/a.txt]");
+		assertStream(stream(x,"/dir/dir/a.txt/", JAPAN)).asString().contains("[cp:/files/test2/ja/JP/dir/dir/a.txt]");
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -313,20 +322,20 @@ public class FileFinder_Test {
 		String[] patterns = {"_a.txt","_b",".c",".d.txt","e.txt","f","g_foo.txt","h.foo.txt","i_foo"};
 
 		for (String p : patterns) {
-			assertStream(x.getStream("files/test1/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
-			assertStream(x.getStream("files/test1/dir/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
-			assertStream(x.getStream("files/test1/dir/dir/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
-			assertStream(x.getStream(" / files/test1/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
-			assertStream(x.getStream(" / files/test1/dir/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
-			assertStream(x.getStream(" / files/test1/dir/dir/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x,"files/test1/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
+			assertStream(stream(x,"files/test1/dir/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
+			assertStream(stream(x,"files/test1/dir/dir/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x," / files/test1/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
+			assertStream(stream(x," / files/test1/dir/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
+			assertStream(stream(x," / files/test1/dir/dir/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
 		}
 
-		assertStream(x.getStream("_a.txt")).asString().contains("[cp:/org/apache/juneau/cp/_a.txt]");
+		assertStream(stream(x,"_a.txt")).asString().contains("[cp:/org/apache/juneau/cp/_a.txt]");
 
 		String[] badPatterns = {"files/test1/bad.txt","files/test1/../test1/_a.txt","files/bad.txt",null,"",".",".."};
 
 		for (String p : badPatterns) {
-			assertStream(x.getStream(p)).doesNotExist();
+			assertStream(stream(x,p)).doesNotExist();
 		}
 	}
 
@@ -340,12 +349,12 @@ public class FileFinder_Test {
 		String[] patterns = {"_a.txt","_b",".c",".d.txt","e.txt","f","g_foo.txt","h.foo.txt","i_foo"};
 
 		for (String p : patterns) {
-			assertStream(x.getStream("files/test1/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
-			assertStream(x.getStream("files/test1/dir/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
-			assertStream(x.getStream("files/test1/dir/dir/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
-			assertStream(x.getStream(" / files/test1/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
-			assertStream(x.getStream(" / files/test1/dir/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
-			assertStream(x.getStream(" / files/test1/dir/dir/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x,"files/test1/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
+			assertStream(stream(x,"files/test1/dir/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
+			assertStream(stream(x,"files/test1/dir/dir/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x," / files/test1/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
+			assertStream(stream(x," / files/test1/dir/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
+			assertStream(stream(x," / files/test1/dir/dir/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
 		}
 	}
 
@@ -359,18 +368,18 @@ public class FileFinder_Test {
 		String[] patterns = {"_a.txt","_b",".c",".d.txt","e.txt","f","g_foo.txt","h.foo.txt","i_foo"};
 
 		for (String p : patterns) {
-			assertStream(x.getStream("test1/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
-			assertStream(x.getStream("test1/dir/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
-			assertStream(x.getStream("test1/dir/dir/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
-			assertStream(x.getStream(" / test1/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
-			assertStream(x.getStream(" / test1/dir/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
-			assertStream(x.getStream(" / test1/dir/dir/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x,"test1/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
+			assertStream(stream(x,"test1/dir/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
+			assertStream(stream(x,"test1/dir/dir/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x," / test1/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
+			assertStream(stream(x," / test1/dir/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
+			assertStream(stream(x," / test1/dir/dir/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
 		}
 
 		String[] badPatterns = {"files/test1/bad.txt","files/test1/../test1/_a.txt","files/bad.txt",null,"",".",".."};
 
 		for (String p : badPatterns) {
-			assertStream(x.getStream(p)).doesNotExist();
+			assertStream(stream(x,p)).doesNotExist();
 		}
 	}
 
@@ -384,12 +393,12 @@ public class FileFinder_Test {
 		String[] patterns = {"_a.txt","_b",".c",".d.txt","e.txt","f","g_foo.txt","h.foo.txt","i_foo"};
 
 		for (String p : patterns) {
-			assertStream(x.getStream("test1/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
-			assertStream(x.getStream("test1/dir/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
-			assertStream(x.getStream("test1/dir/dir/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
-			assertStream(x.getStream(" / test1/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
-			assertStream(x.getStream(" / test1/dir/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
-			assertStream(x.getStream(" / test1/dir/dir/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x,"test1/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
+			assertStream(stream(x,"test1/dir/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
+			assertStream(stream(x,"test1/dir/dir/"+p)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x," / test1/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
+			assertStream(stream(x," / test1/dir/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
+			assertStream(stream(x," / test1/dir/dir/"+p+" / ")).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
 		}
 	}
 
@@ -408,34 +417,34 @@ public class FileFinder_Test {
 		for (int i = 0; i < patterns.length; i++) {
 			String p = patterns[i], p_ja = patterns_ja[i], p_ja_JP = patterns_ja_JP[i];
 
-			assertStream(x.getStream("test1/"+p,null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
-			assertStream(x.getStream("test1/dir/"+p,null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
-			assertStream(x.getStream("test1/dir/dir/"+p,null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
-			assertStream(x.getStream("/test1/"+p+"/",null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
-			assertStream(x.getStream("/test1/dir/"+p+"/",null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
-			assertStream(x.getStream("/test1/dir/dir/"+p+"/",null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
-
-			assertStream(x.getStream("test1/"+p,JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p_ja+"]");
-			assertStream(x.getStream("test1/dir/"+p,JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p_ja+"]");
-			assertStream(x.getStream("test1/dir/dir/"+p,JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p_ja+"]");
-			assertStream(x.getStream("/test1/"+p+"/",JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p_ja+"]");
-			assertStream(x.getStream("/test1/dir/"+p+"/",JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p_ja+"]");
-			assertStream(x.getStream("/test1/dir/dir/"+p+"/",JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p_ja+"]");
-
-			assertStream(x.getStream("test1/"+p,JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p_ja_JP+"]");
-			assertStream(x.getStream("test1/dir/"+p,JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p_ja_JP+"]");
-			assertStream(x.getStream("test1/dir/dir/"+p,JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p_ja_JP+"]");
-			assertStream(x.getStream("/test1/"+p+"/",JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p_ja_JP+"]");
-			assertStream(x.getStream("/test1/dir/"+p+"/",JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p_ja_JP+"]");
-			assertStream(x.getStream("/test1/dir/dir/"+p+"/",JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p_ja_JP+"]");
+			assertStream(stream(x,"test1/"+p,null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
+			assertStream(stream(x,"test1/dir/"+p,null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
+			assertStream(stream(x,"test1/dir/dir/"+p,null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x,"/test1/"+p+"/",null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
+			assertStream(stream(x,"/test1/dir/"+p+"/",null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
+			assertStream(stream(x,"/test1/dir/dir/"+p+"/",null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
+
+			assertStream(stream(x,"test1/"+p,JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p_ja+"]");
+			assertStream(stream(x,"test1/dir/"+p,JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p_ja+"]");
+			assertStream(stream(x,"test1/dir/dir/"+p,JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p_ja+"]");
+			assertStream(stream(x,"/test1/"+p+"/",JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p_ja+"]");
+			assertStream(stream(x,"/test1/dir/"+p+"/",JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p_ja+"]");
+			assertStream(stream(x,"/test1/dir/dir/"+p+"/",JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p_ja+"]");
+
+			assertStream(stream(x,"test1/"+p,JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p_ja_JP+"]");
+			assertStream(stream(x,"test1/dir/"+p,JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p_ja_JP+"]");
+			assertStream(stream(x,"test1/dir/dir/"+p,JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p_ja_JP+"]");
+			assertStream(stream(x,"/test1/"+p+"/",JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p_ja_JP+"]");
+			assertStream(stream(x,"/test1/dir/"+p+"/",JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p_ja_JP+"]");
+			assertStream(stream(x,"/test1/dir/dir/"+p+"/",JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p_ja_JP+"]");
 		}
 
 		String[] badPatterns = {"test1/bad.txt","test1/../test1/_a.txt","bad.txt",null,"",".",".."};
 
 		for (String p : badPatterns) {
-			assertStream(x.getStream(p,null)).doesNotExist();
-			assertStream(x.getStream(p,JAPANESE)).doesNotExist();
-			assertStream(x.getStream(p,JAPAN)).doesNotExist();
+			assertStream(stream(x,p,null)).doesNotExist();
+			assertStream(stream(x,p,JAPANESE)).doesNotExist();
+			assertStream(stream(x,p,JAPAN)).doesNotExist();
 		}
 	}
 
@@ -454,26 +463,26 @@ public class FileFinder_Test {
 		for (int i = 0; i < patterns.length; i++) {
 			String p = patterns[i], p_ja = patterns_ja[i], p_ja_JP = patterns_ja_JP[i];
 
-			assertStream(x.getStream("test1/"+p,null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
-			assertStream(x.getStream("test1/dir/"+p,null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
-			assertStream(x.getStream("test1/dir/dir/"+p,null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
-			assertStream(x.getStream("/test1/"+p+"/",null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
-			assertStream(x.getStream("/test1/dir/"+p+"/",null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
-			assertStream(x.getStream("/test1/dir/dir/"+p+"/",null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
-
-			assertStream(x.getStream("test1/"+p,JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p_ja+"]");
-			assertStream(x.getStream("test1/dir/"+p,JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p_ja+"]");
-			assertStream(x.getStream("test1/dir/dir/"+p,JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p_ja+"]");
-			assertStream(x.getStream("/test1/"+p+"/",JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p_ja+"]");
-			assertStream(x.getStream("/test1/dir/"+p+"/",JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p_ja+"]");
-			assertStream(x.getStream("/test1/dir/dir/"+p+"/",JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p_ja+"]");
-
-			assertStream(x.getStream("test1/"+p,JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p_ja_JP+"]");
-			assertStream(x.getStream("test1/dir/"+p,JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p_ja_JP+"]");
-			assertStream(x.getStream("test1/dir/dir/"+p,JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p_ja_JP+"]");
-			assertStream(x.getStream("/test1/"+p+"/",JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p_ja_JP+"]");
-			assertStream(x.getStream("/test1/dir/"+p+"/",JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p_ja_JP+"]");
-			assertStream(x.getStream("/test1/dir/dir/"+p+"/",JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p_ja_JP+"]");
+			assertStream(stream(x,"test1/"+p,null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
+			assertStream(stream(x,"test1/dir/"+p,null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
+			assertStream(stream(x,"test1/dir/dir/"+p,null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
+			assertStream(stream(x,"/test1/"+p+"/",null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p+"]");
+			assertStream(stream(x,"/test1/dir/"+p+"/",null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p+"]");
+			assertStream(stream(x,"/test1/dir/dir/"+p+"/",null)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p+"]");
+
+			assertStream(stream(x,"test1/"+p,JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p_ja+"]");
+			assertStream(stream(x,"test1/dir/"+p,JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p_ja+"]");
+			assertStream(stream(x,"test1/dir/dir/"+p,JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p_ja+"]");
+			assertStream(stream(x,"/test1/"+p+"/",JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p_ja+"]");
+			assertStream(stream(x,"/test1/dir/"+p+"/",JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p_ja+"]");
+			assertStream(stream(x,"/test1/dir/dir/"+p+"/",JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p_ja+"]");
+
+			assertStream(stream(x,"test1/"+p,JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p_ja_JP+"]");
+			assertStream(stream(x,"test1/dir/"+p,JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p_ja_JP+"]");
+			assertStream(stream(x,"test1/dir/dir/"+p,JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p_ja_JP+"]");
+			assertStream(stream(x,"/test1/"+p+"/",JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/"+p_ja_JP+"]");
+			assertStream(stream(x,"/test1/dir/"+p+"/",JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/"+p_ja_JP+"]");
+			assertStream(stream(x,"/test1/dir/dir/"+p+"/",JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test1/dir/dir/"+p_ja_JP+"]");
 		}
 	}
 
@@ -484,26 +493,26 @@ public class FileFinder_Test {
 			.cp(FileFinder_Test.class, "files/test2", false)
 			.build();
 
-		assertStream(x.getStream("a.txt", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/a.txt]");
-		assertStream(x.getStream("a.txt", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/a.txt]");
-		assertStream(x.getStream("a.txt", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/a.txt]");
-		assertStream(x.getStream("/a.txt/", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/a.txt]");
-		assertStream(x.getStream("/a.txt/", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/a.txt]");
-		assertStream(x.getStream("/a.txt/", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/a.txt]");
-
-		assertStream(x.getStream("dir/a.txt", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/a.txt]");
-		assertStream(x.getStream("dir/a.txt", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/a.txt]");
-		assertStream(x.getStream("dir/a.txt", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/a.txt]");
-		assertStream(x.getStream("/dir/a.txt/", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/a.txt]");
-		assertStream(x.getStream("/dir/a.txt/", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/a.txt]");
-		assertStream(x.getStream("/dir/a.txt/", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/a.txt]");
-
-		assertStream(x.getStream("dir/dir/a.txt", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/dir/a.txt]");
-		assertStream(x.getStream("dir/dir/a.txt", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/dir/a.txt]");
-		assertStream(x.getStream("dir/dir/a.txt", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/dir/a.txt]");
-		assertStream(x.getStream("/dir/dir/a.txt/", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/dir/a.txt]");
-		assertStream(x.getStream("/dir/dir/a.txt/", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/dir/a.txt]");
-		assertStream(x.getStream("/dir/dir/a.txt/", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/dir/a.txt]");
+		assertStream(stream(x,"a.txt", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/a.txt]");
+		assertStream(stream(x,"a.txt", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/a.txt]");
+		assertStream(stream(x,"a.txt", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/a.txt]");
+		assertStream(stream(x,"/a.txt/", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/a.txt]");
+		assertStream(stream(x,"/a.txt/", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/a.txt]");
+		assertStream(stream(x,"/a.txt/", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/a.txt]");
+
+		assertStream(stream(x,"dir/a.txt", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/a.txt]");
+		assertStream(stream(x,"dir/a.txt", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/a.txt]");
+		assertStream(stream(x,"dir/a.txt", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/a.txt]");
+		assertStream(stream(x,"/dir/a.txt/", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/a.txt]");
+		assertStream(stream(x,"/dir/a.txt/", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/a.txt]");
+		assertStream(stream(x,"/dir/a.txt/", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/a.txt]");
+
+		assertStream(stream(x,"dir/dir/a.txt", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/dir/a.txt]");
+		assertStream(stream(x,"dir/dir/a.txt", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/dir/a.txt]");
+		assertStream(stream(x,"dir/dir/a.txt", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/dir/a.txt]");
+		assertStream(stream(x,"/dir/dir/a.txt/", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/dir/a.txt]");
+		assertStream(stream(x,"/dir/dir/a.txt/", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/dir/a.txt]");
+		assertStream(stream(x,"/dir/dir/a.txt/", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/dir/a.txt]");
 	}
 
 	@Test
@@ -513,26 +522,26 @@ public class FileFinder_Test {
 			.cp(FileFinder_Test2.class, "files/test2", true)
 			.build();
 
-		assertStream(x.getStream("a.txt", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/a.txt]");
-		assertStream(x.getStream("a.txt", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/a.txt]");
-		assertStream(x.getStream("a.txt", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/a.txt]");
-		assertStream(x.getStream("/a.txt/", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/a.txt]");
-		assertStream(x.getStream("/a.txt/", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/a.txt]");
-		assertStream(x.getStream("/a.txt/", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/a.txt]");
-
-		assertStream(x.getStream("dir/a.txt", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/a.txt]");
-		assertStream(x.getStream("dir/a.txt", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/a.txt]");
-		assertStream(x.getStream("dir/a.txt", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/a.txt]");
-		assertStream(x.getStream("/dir/a.txt/", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/a.txt]");
-		assertStream(x.getStream("/dir/a.txt/", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/a.txt]");
-		assertStream(x.getStream("/dir/a.txt/", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/a.txt]");
-
-		assertStream(x.getStream("dir/dir/a.txt", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/dir/a.txt]");
-		assertStream(x.getStream("dir/dir/a.txt", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/dir/a.txt]");
-		assertStream(x.getStream("dir/dir/a.txt", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/dir/a.txt]");
-		assertStream(x.getStream("/dir/dir/a.txt/", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/dir/a.txt]");
-		assertStream(x.getStream("/dir/dir/a.txt/", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/dir/a.txt]");
-		assertStream(x.getStream("/dir/dir/a.txt/", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/dir/a.txt]");
+		assertStream(stream(x,"a.txt", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/a.txt]");
+		assertStream(stream(x,"a.txt", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/a.txt]");
+		assertStream(stream(x,"a.txt", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/a.txt]");
+		assertStream(stream(x,"/a.txt/", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/a.txt]");
+		assertStream(stream(x,"/a.txt/", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/a.txt]");
+		assertStream(stream(x,"/a.txt/", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/a.txt]");
+
+		assertStream(stream(x,"dir/a.txt", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/a.txt]");
+		assertStream(stream(x,"dir/a.txt", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/a.txt]");
+		assertStream(stream(x,"dir/a.txt", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/a.txt]");
+		assertStream(stream(x,"/dir/a.txt/", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/a.txt]");
+		assertStream(stream(x,"/dir/a.txt/", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/a.txt]");
+		assertStream(stream(x,"/dir/a.txt/", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/a.txt]");
+
+		assertStream(stream(x,"dir/dir/a.txt", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/dir/a.txt]");
+		assertStream(stream(x,"dir/dir/a.txt", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/dir/a.txt]");
+		assertStream(stream(x,"dir/dir/a.txt", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/dir/a.txt]");
+		assertStream(stream(x,"/dir/dir/a.txt/", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/dir/a.txt]");
+		assertStream(stream(x,"/dir/dir/a.txt/", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/dir/a.txt]");
+		assertStream(stream(x,"/dir/dir/a.txt/", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/dir/a.txt]");
 
 		x = FileFinder
 			.create()
@@ -549,17 +558,17 @@ public class FileFinder_Test {
 			.exclude("(?i).*\\.(txt)")
 			.build();
 
-		assertStream(x.getStream("a.txt", null)).doesNotExist();
-		assertStream(x.getStream("a.txt", JAPANESE)).doesNotExist();
-		assertStream(x.getStream("a.txt", JAPAN)).doesNotExist();
+		assertStream(stream(x,"a.txt", null)).doesNotExist();
+		assertStream(stream(x,"a.txt", JAPANESE)).doesNotExist();
+		assertStream(stream(x,"a.txt", JAPAN)).doesNotExist();
 
-		assertStream(x.getStream("dir/a.txt", null)).doesNotExist();
-		assertStream(x.getStream("dir/a.txt", JAPANESE)).doesNotExist();
-		assertStream(x.getStream("dir/a.txt", JAPAN)).doesNotExist();
+		assertStream(stream(x,"dir/a.txt", null)).doesNotExist();
+		assertStream(stream(x,"dir/a.txt", JAPANESE)).doesNotExist();
+		assertStream(stream(x,"dir/a.txt", JAPAN)).doesNotExist();
 
-		assertStream(x.getStream("dir/dir/a.txt", null)).doesNotExist();
-		assertStream(x.getStream("dir/dir/a.txt", JAPANESE)).doesNotExist();
-		assertStream(x.getStream("dir/dir/a.txt", JAPAN)).doesNotExist();
+		assertStream(stream(x,"dir/dir/a.txt", null)).doesNotExist();
+		assertStream(stream(x,"dir/dir/a.txt", JAPANESE)).doesNotExist();
+		assertStream(stream(x,"dir/dir/a.txt", JAPAN)).doesNotExist();
 
 		x = FileFinder
 			.create()
@@ -567,17 +576,17 @@ public class FileFinder_Test {
 			.exclude("(?i).*\\.(TXT)")
 			.build();
 
-		assertStream(x.getStream("a.txt", null)).doesNotExist();
-		assertStream(x.getStream("a.txt", JAPANESE)).doesNotExist();
-		assertStream(x.getStream("a.txt", JAPAN)).doesNotExist();
+		assertStream(stream(x,"a.txt", null)).doesNotExist();
+		assertStream(stream(x,"a.txt", JAPANESE)).doesNotExist();
+		assertStream(stream(x,"a.txt", JAPAN)).doesNotExist();
 
-		assertStream(x.getStream("dir/a.txt", null)).doesNotExist();
-		assertStream(x.getStream("dir/a.txt", JAPANESE)).doesNotExist();
-		assertStream(x.getStream("dir/a.txt", JAPAN)).doesNotExist();
+		assertStream(stream(x,"dir/a.txt", null)).doesNotExist();
+		assertStream(stream(x,"dir/a.txt", JAPANESE)).doesNotExist();
+		assertStream(stream(x,"dir/a.txt", JAPAN)).doesNotExist();
 
-		assertStream(x.getStream("dir/dir/a.txt", null)).doesNotExist();
-		assertStream(x.getStream("dir/dir/a.txt", JAPANESE)).doesNotExist();
-		assertStream(x.getStream("dir/dir/a.txt", JAPAN)).doesNotExist();
+		assertStream(stream(x,"dir/dir/a.txt", null)).doesNotExist();
+		assertStream(stream(x,"dir/dir/a.txt", JAPANESE)).doesNotExist();
+		assertStream(stream(x,"dir/dir/a.txt", JAPAN)).doesNotExist();
 
 		x = FileFinder
 			.create()
@@ -585,17 +594,17 @@ public class FileFinder_Test {
 			.exclude()
 			.build();
 
-		assertStream(x.getStream("a.txt", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/a.txt]");
-		assertStream(x.getStream("a.txt", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/a.txt]");
-		assertStream(x.getStream("a.txt", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/a.txt]");
+		assertStream(stream(x,"a.txt", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/a.txt]");
+		assertStream(stream(x,"a.txt", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/a.txt]");
+		assertStream(stream(x,"a.txt", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/a.txt]");
 
-		assertStream(x.getStream("dir/a.txt", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/a.txt]");
-		assertStream(x.getStream("dir/a.txt", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/a.txt]");
-		assertStream(x.getStream("dir/a.txt", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/a.txt]");
+		assertStream(stream(x,"dir/a.txt", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/a.txt]");
+		assertStream(stream(x,"dir/a.txt", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/a.txt]");
+		assertStream(stream(x,"dir/a.txt", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/a.txt]");
 
-		assertStream(x.getStream("dir/dir/a.txt", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/dir/a.txt]");
-		assertStream(x.getStream("dir/dir/a.txt", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/dir/a.txt]");
-		assertStream(x.getStream("dir/dir/a.txt", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/dir/a.txt]");
+		assertStream(stream(x,"dir/dir/a.txt", null)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/dir/dir/a.txt]");
+		assertStream(stream(x,"dir/dir/a.txt", JAPANESE)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/dir/dir/a.txt]");
+		assertStream(stream(x,"dir/dir/a.txt", JAPAN)).asString().contains("[cp:/org/apache/juneau/cp/files/test2/ja/JP/dir/dir/a.txt]");
 	}
 
 	//-----------------------------------------------------------------------------------------------------------------
@@ -630,8 +639,8 @@ public class FileFinder_Test {
 			.caching(100_000_000)
 			.build();
 
-		assertStream(x.getStream("files/test1/_a.txt")).asString().contains("[home:/files/test1/_a.txt]");
-		assertStream(x.getStream("files/test1/_a.txt")).asString().contains("[home:/files/test1/_a.txt]");
+		assertStream(stream(x,"files/test1/_a.txt")).asString().contains("[home:/files/test1/_a.txt]");
+		assertStream(stream(x,"files/test1/_a.txt")).asString().contains("[home:/files/test1/_a.txt]");
 
 		x = FileFinder
 			.create()
@@ -639,8 +648,8 @@ public class FileFinder_Test {
 			.caching(1)
 			.build();
 
-		assertStream(x.getStream("files/test1/_a.txt")).asString().contains("[home:/files/test1/_a.txt]");
-		assertStream(x.getStream("files/test1/_a.txt")).asString().contains("[home:/files/test1/_a.txt]");
+		assertStream(stream(x,"files/test1/_a.txt")).asString().contains("[home:/files/test1/_a.txt]");
+		assertStream(stream(x,"files/test1/_a.txt")).asString().contains("[home:/files/test1/_a.txt]");
 
 		x = FileFinder
 			.create()
@@ -648,8 +657,8 @@ public class FileFinder_Test {
 			.caching(100_000_000)
 			.build();
 
-		assertStream(x.getStream("files/test1/_a.txt")).asString().contains("[cp:/files/test1/_a.txt]");
-		assertStream(x.getStream("files/test1/_a.txt")).asString().contains("[cp:/files/test1/_a.txt]");
+		assertStream(stream(x,"files/test1/_a.txt")).asString().contains("[cp:/files/test1/_a.txt]");
+		assertStream(stream(x,"files/test1/_a.txt")).asString().contains("[cp:/files/test1/_a.txt]");
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/HeaderInfo_Test.java b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/HeaderInfo_Test.java
index b8cbdbd..4987409 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/HeaderInfo_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/HeaderInfo_Test.java
@@ -78,13 +78,13 @@ public class HeaderInfo_Test {
 		HeaderInfo t = new HeaderInfo();
 
 		t.items(items("foo"));
-		assertObject(t.items()).asJson().is("{type:'foo'}");
+		assertOptional(t.items()).asJson().is("{type:'foo'}");
 
 		t.items("{type:'foo'}");
-		assertObject(t.items()).isType(Items.class).asJson().is("{type:'foo'}");
+		assertOptional(t.items()).isType(Items.class).asJson().is("{type:'foo'}");
 
 		t.items((Items)null);
-		assertObject(t.items()).isNull();
+		assertOptional(t.items()).isNull();
 	}
 
 	/**
@@ -112,10 +112,10 @@ public class HeaderInfo_Test {
 		assertString(t._default()).is("foo");
 
 		t._default(new StringBuilder("foo"));
-		assertObject(t._default()).isType(StringBuilder.class).asString().is("foo");
+		assertOptional(t._default()).isType(StringBuilder.class).asString().is("foo");
 
 		t._default(null);
-		assertObject(t._default()).isNull();
+		assertOptional(t._default()).isNull();
 	}
 
 	/**
@@ -126,16 +126,16 @@ public class HeaderInfo_Test {
 		HeaderInfo t = new HeaderInfo();
 
 		t.maximum(123);
-		assertObject(t.maximum()).isType(Integer.class).is(123);
+		assertOptional(t.maximum()).isType(Integer.class).is(123);
 
 		t.maximum(123f);
-		assertObject(t.maximum()).isType(Float.class).is(123f);
+		assertOptional(t.maximum()).isType(Float.class).is(123f);
 
 		t.maximum("123");
-		assertObject(t.maximum()).isType(Integer.class).is(123);
+		assertOptional(t.maximum()).isType(Integer.class).is(123);
 
 		t.maximum((String)null);
-		assertObject(t.maximum()).isNull();
+		assertOptional(t.maximum()).isNull();
 	}
 
 	/**
@@ -146,13 +146,13 @@ public class HeaderInfo_Test {
 		HeaderInfo t = new HeaderInfo();
 
 		t.exclusiveMaximum(true);
-		assertObject(t.exclusiveMaximum()).isType(Boolean.class).is(true);
+		assertOptional(t.exclusiveMaximum()).isType(Boolean.class).is(true);
 
 		t.exclusiveMaximum("true");
-		assertObject(t.exclusiveMaximum()).isType(Boolean.class).is(true);
+		assertOptional(t.exclusiveMaximum()).isType(Boolean.class).is(true);
 
 		t.exclusiveMaximum((String)null);
-		assertObject(t.exclusiveMaximum()).isNull();
+		assertOptional(t.exclusiveMaximum()).isNull();
 	}
 
 	/**
@@ -163,16 +163,16 @@ public class HeaderInfo_Test {
 		HeaderInfo t = new HeaderInfo();
 
 		t.minimum(123);
-		assertObject(t.minimum()).isType(Integer.class).is(123);
+		assertOptional(t.minimum()).isType(Integer.class).is(123);
 
 		t.minimum(123f);
-		assertObject(t.minimum()).isType(Float.class).is(123f);
+		assertOptional(t.minimum()).isType(Float.class).is(123f);
 
 		t.minimum("123");
-		assertObject(t.minimum()).isType(Integer.class).is(123);
+		assertOptional(t.minimum()).isType(Integer.class).is(123);
 
 		t.minimum((String)null);
-		assertObject(t.minimum()).isNull();
+		assertOptional(t.minimum()).isNull();
 	}
 
 	/**
@@ -183,13 +183,13 @@ public class HeaderInfo_Test {
 		HeaderInfo t = new HeaderInfo();
 
 		t.exclusiveMinimum(true);
-		assertObject(t.exclusiveMinimum()).isType(Boolean.class).is(true);
+		assertOptional(t.exclusiveMinimum()).isType(Boolean.class).is(true);
 
 		t.exclusiveMinimum("true");
-		assertObject(t.exclusiveMinimum()).isType(Boolean.class).is(true);
+		assertOptional(t.exclusiveMinimum()).isType(Boolean.class).is(true);
 
 		t.exclusiveMinimum((String)null);
-		assertObject(t.exclusiveMinimum()).isNull();
+		assertOptional(t.exclusiveMinimum()).isNull();
 	}
 
 	/**
@@ -200,13 +200,13 @@ public class HeaderInfo_Test {
 		HeaderInfo t = new HeaderInfo();
 
 		t.maxLength(123);
-		assertObject(t.maxLength()).isType(Integer.class).is(123);
+		assertOptional(t.maxLength()).isType(Integer.class).is(123);
 
 		t.maxLength("123");
-		assertObject(t.maxLength()).isType(Integer.class).is(123);
+		assertOptional(t.maxLength()).isType(Integer.class).is(123);
 
 		t.maxLength((String)null);
-		assertObject(t.maxLength()).isNull();
+		assertOptional(t.maxLength()).isNull();
 	}
 
 	/**
@@ -217,13 +217,13 @@ public class HeaderInfo_Test {
 		HeaderInfo t = new HeaderInfo();
 
 		t.minLength(123);
-		assertObject(t.minLength()).isType(Integer.class).is(123);
+		assertOptional(t.minLength()).isType(Integer.class).is(123);
 
 		t.minLength("123");
-		assertObject(t.minLength()).isType(Integer.class).is(123);
+		assertOptional(t.minLength()).isType(Integer.class).is(123);
 
 		t.minLength((String)null);
-		assertObject(t.minLength()).isNull();
+		assertOptional(t.minLength()).isNull();
 	}
 
 	/**
@@ -248,13 +248,13 @@ public class HeaderInfo_Test {
 		HeaderInfo t = new HeaderInfo();
 
 		t.maxItems(123);
-		assertObject(t.maxItems()).isType(Integer.class).is(123);
+		assertOptional(t.maxItems()).isType(Integer.class).is(123);
 
 		t.maxItems("123");
-		assertObject(t.maxItems()).isType(Integer.class).is(123);
+		assertOptional(t.maxItems()).isType(Integer.class).is(123);
 
 		t.maxItems((String)null);
-		assertObject(t.maxItems()).isNull();
+		assertOptional(t.maxItems()).isNull();
 	}
 
 	/**
@@ -265,13 +265,13 @@ public class HeaderInfo_Test {
 		HeaderInfo t = new HeaderInfo();
 
 		t.minItems(123);
-		assertObject(t.minItems()).isType(Integer.class).is(123);
+		assertOptional(t.minItems()).isType(Integer.class).is(123);
 
 		t.minItems("123");
-		assertObject(t.minItems()).isType(Integer.class).is(123);
+		assertOptional(t.minItems()).isType(Integer.class).is(123);
 
 		t.minItems((String)null);
-		assertObject(t.minItems()).isNull();
+		assertOptional(t.minItems()).isNull();
 	}
 
 	/**
@@ -282,13 +282,13 @@ public class HeaderInfo_Test {
 		HeaderInfo t = new HeaderInfo();
 
 		t.uniqueItems(true);
-		assertObject(t.uniqueItems()).isType(Boolean.class).is(true);
+		assertOptional(t.uniqueItems()).isType(Boolean.class).is(true);
 
 		t.uniqueItems("true");
-		assertObject(t.uniqueItems()).isType(Boolean.class).is(true);
+		assertOptional(t.uniqueItems()).isType(Boolean.class).is(true);
 
 		t.uniqueItems((String)null);
-		assertObject(t.uniqueItems()).isNull();
+		assertOptional(t.uniqueItems()).isNull();
 	}
 
 	/**
@@ -299,19 +299,19 @@ public class HeaderInfo_Test {
 		HeaderInfo t = new HeaderInfo();
 
 		t._enum(ASet.of("foo","bar"));
-		assertObject(t._enum()).isType(Set.class).asJson().is("['foo','bar']");
+		assertOptional(t._enum()).isType(Set.class).asJson().is("['foo','bar']");
 
 		t._enum(ASet.of());
-		assertObject(t._enum()).isType(Set.class).asJson().is("[]");
+		assertOptional(t._enum()).isType(Set.class).asJson().is("[]");
 
 		t._enum("foo","bar");
-		assertObject(t._enum()).isType(Set.class).asJson().is("['foo','bar']");
+		assertOptional(t._enum()).isType(Set.class).asJson().is("['foo','bar']");
 
 		t._enum(new Object[0]);
-		assertObject(t._enum()).isNull();
+		assertOptional(t._enum()).isNull();
 
 		t._enum((Collection<Object>)null);
-		assertObject(t._enum()).isNull();
+		assertOptional(t._enum()).isNull();
 
 		t.addEnum(ASet.of("foo","bar"));
 		assertObject(t.getEnum()).isType(Set.class).asJson().is("['foo','bar']");
@@ -323,7 +323,7 @@ public class HeaderInfo_Test {
 		assertObject(t.getEnum()).isType(Set.class).asJson().is("['foo','bar','baz']");
 
 		t.addEnum(ASet.of("foo","bar"));
-		assertObject(t._enum()).isType(Set.class).asJson().is("['foo','bar','baz']");
+		assertOptional(t._enum()).isType(Set.class).asJson().is("['foo','bar','baz']");
 	}
 
 	/**
@@ -334,16 +334,16 @@ public class HeaderInfo_Test {
 		HeaderInfo t = new HeaderInfo();
 
 		t.multipleOf(123);
-		assertObject(t.multipleOf()).isType(Integer.class).is(123);
+		assertOptional(t.multipleOf()).isType(Integer.class).is(123);
 
 		t.multipleOf(123f);
-		assertObject(t.multipleOf()).isType(Float.class).is(123f);
+		assertOptional(t.multipleOf()).isType(Float.class).is(123f);
 
 		t.multipleOf("123");
-		assertObject(t.multipleOf()).isType(Integer.class).is(123);
+		assertOptional(t.multipleOf()).isType(Integer.class).is(123);
 
 		t.multipleOf((String)null);
-		assertObject(t.multipleOf()).isNull();
+		assertOptional(t.multipleOf()).isNull();
 	}
 
 	/**
@@ -354,13 +354,13 @@ public class HeaderInfo_Test {
 		HeaderInfo t = new HeaderInfo();
 
 		t.example("foo");
-		assertObject(t.example()).isType(String.class).is("foo");
+		assertOptional(t.example()).isType(String.class).is("foo");
 
 		t.example(123f);
-		assertObject(t.example()).isType(Float.class).is(123f);
+		assertOptional(t.example()).isType(Float.class).is(123f);
 
 		t.example((String)null);
-		assertObject(t.example()).isNull();
+		assertOptional(t.example()).isNull();
 	}
 
 
@@ -375,7 +375,7 @@ public class HeaderInfo_Test {
 		assertString(t.ref()).is("foo");
 
 		t.ref(null);
-		assertObject(t.ref()).isNull();
+		assertOptional(t.ref()).isNull();
 	}
 
 	/**
diff --git a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Info_Test.java b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Info_Test.java
index 45143f2..2c96190 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Info_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Info_Test.java
@@ -75,13 +75,13 @@ public class Info_Test {
 		Info t = new Info();
 
 		t.contact(contact("foo"));
-		assertObject(t.contact()).asJson().is("{name:'foo'}");
+		assertOptional(t.contact()).asJson().is("{name:'foo'}");
 
 		t.contact("{name:'foo'}");
-		assertObject(t.contact()).isType(Contact.class).asJson().is("{name:'foo'}");
+		assertOptional(t.contact()).isType(Contact.class).asJson().is("{name:'foo'}");
 
 		t.contact((String)null);
-		assertObject(t.contact()).isNull();
+		assertOptional(t.contact()).isNull();
 	}
 
 	/**
@@ -92,13 +92,13 @@ public class Info_Test {
 		Info t = new Info();
 
 		t.license(license("foo"));
-		assertObject(t.license()).isType(License.class).asJson().is("{name:'foo'}");
+		assertOptional(t.license()).isType(License.class).asJson().is("{name:'foo'}");
 
 		t.license("{name:'foo'}");
-		assertObject(t.license()).isType(License.class).asJson().is("{name:'foo'}");
+		assertOptional(t.license()).isType(License.class).asJson().is("{name:'foo'}");
 
 		t.license((String)null);
-		assertObject(t.license()).isNull();
+		assertOptional(t.license()).isNull();
 	}
 
 	/**
diff --git a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Items_Test.java b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Items_Test.java
index 134e765..e3df9bf 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Items_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Items_Test.java
@@ -65,13 +65,13 @@ public class Items_Test {
 		Items t = new Items();
 
 		t.items(items("foo"));
-		assertObject(t.items()).asJson().is("{type:'foo'}");
+		assertOptional(t.items()).asJson().is("{type:'foo'}");
 
 		t.items("{type:'foo'}");
-		assertObject(t.items()).isType(Items.class).asJson().is("{type:'foo'}");
+		assertOptional(t.items()).isType(Items.class).asJson().is("{type:'foo'}");
 
 		t.items((String)null);
-		assertObject(t.items()).isNull();
+		assertOptional(t.items()).isNull();
 	}
 
 	/**
@@ -96,13 +96,13 @@ public class Items_Test {
 		Items t = new Items();
 
 		t._default("foo");
-		assertObject(t._default()).is("foo");
+		assertOptional(t._default()).is("foo");
 
 		t._default(new StringBuilder("foo"));
-		assertObject(t._default()).isType(StringBuilder.class).asString().is("foo");
+		assertOptional(t._default()).isType(StringBuilder.class).asString().is("foo");
 
 		t._default(null);
-		assertObject(t._default()).isNull();
+		assertOptional(t._default()).isNull();
 	}
 
 	/**
@@ -113,16 +113,16 @@ public class Items_Test {
 		Items t = new Items();
 
 		t.maximum(123);
-		assertObject(t.maximum()).isType(Integer.class).is(123);
+		assertOptional(t.maximum()).isType(Integer.class).is(123);
 
 		t.maximum(123f);
-		assertObject(t.maximum()).isType(Float.class).is(123f);
+		assertOptional(t.maximum()).isType(Float.class).is(123f);
 
 		t.maximum("123");
-		assertObject(t.maximum()).isType(Integer.class).is(123);
+		assertOptional(t.maximum()).isType(Integer.class).is(123);
 
 		t.maximum((String)null);
-		assertObject(t.maximum()).isNull();
+		assertOptional(t.maximum()).isNull();
 	}
 
 	/**
@@ -133,13 +133,13 @@ public class Items_Test {
 		Items t = new Items();
 
 		t.exclusiveMaximum(true);
-		assertObject(t.exclusiveMaximum()).isType(Boolean.class).is(true);
+		assertOptional(t.exclusiveMaximum()).isType(Boolean.class).is(true);
 
 		t.exclusiveMaximum("true");
-		assertObject(t.exclusiveMaximum()).isType(Boolean.class).is(true);
+		assertOptional(t.exclusiveMaximum()).isType(Boolean.class).is(true);
 
 		t.exclusiveMaximum((String)null);
-		assertObject(t.exclusiveMaximum()).isNull();
+		assertOptional(t.exclusiveMaximum()).isNull();
 	}
 
 	/**
@@ -150,16 +150,16 @@ public class Items_Test {
 		Items t = new Items();
 
 		t.minimum(123);
-		assertObject(t.minimum()).isType(Integer.class).is(123);
+		assertOptional(t.minimum()).isType(Integer.class).is(123);
 
 		t.minimum(123f);
-		assertObject(t.minimum()).isType(Float.class).is(123f);
+		assertOptional(t.minimum()).isType(Float.class).is(123f);
 
 		t.minimum("123");
-		assertObject(t.minimum()).isType(Integer.class).is(123);
+		assertOptional(t.minimum()).isType(Integer.class).is(123);
 
 		t.minimum((String)null);
-		assertObject(t.minimum()).isNull();
+		assertOptional(t.minimum()).isNull();
 	}
 
 	/**
@@ -170,13 +170,13 @@ public class Items_Test {
 		Items t = new Items();
 
 		t.exclusiveMinimum(true);
-		assertObject(t.exclusiveMinimum()).isType(Boolean.class).is(true);
+		assertOptional(t.exclusiveMinimum()).isType(Boolean.class).is(true);
 
 		t.exclusiveMinimum("true");
-		assertObject(t.exclusiveMinimum()).isType(Boolean.class).is(true);
+		assertOptional(t.exclusiveMinimum()).isType(Boolean.class).is(true);
 
 		t.exclusiveMinimum((String)null);
-		assertObject(t.exclusiveMinimum()).isNull();
+		assertOptional(t.exclusiveMinimum()).isNull();
 	}
 
 	/**
@@ -187,13 +187,13 @@ public class Items_Test {
 		Items t = new Items();
 
 		t.maxLength(123);
-		assertObject(t.maxLength()).isType(Integer.class).is(123);
+		assertOptional(t.maxLength()).isType(Integer.class).is(123);
 
 		t.maxLength("123");
-		assertObject(t.maxLength()).isType(Integer.class).is(123);
+		assertOptional(t.maxLength()).isType(Integer.class).is(123);
 
 		t.maxLength((String)null);
-		assertObject(t.maxLength()).isNull();
+		assertOptional(t.maxLength()).isNull();
 	}
 
 	/**
@@ -204,13 +204,13 @@ public class Items_Test {
 		Items t = new Items();
 
 		t.minLength(123);
-		assertObject(t.minLength()).isType(Integer.class).is(123);
+		assertOptional(t.minLength()).isType(Integer.class).is(123);
 
 		t.minLength("123");
-		assertObject(t.minLength()).isType(Integer.class).is(123);
+		assertOptional(t.minLength()).isType(Integer.class).is(123);
 
 		t.minLength((String)null);
-		assertObject(t.minLength()).isNull();
+		assertOptional(t.minLength()).isNull();
 	}
 
 	/**
@@ -235,13 +235,13 @@ public class Items_Test {
 		Items t = new Items();
 
 		t.maxItems(123);
-		assertObject(t.maxItems()).isType(Integer.class).is(123);
+		assertOptional(t.maxItems()).isType(Integer.class).is(123);
 
 		t.maxItems("123");
-		assertObject(t.maxItems()).isType(Integer.class).is(123);
+		assertOptional(t.maxItems()).isType(Integer.class).is(123);
 
 		t.maxItems((String)null);
-		assertObject(t.maxItems()).isNull();
+		assertOptional(t.maxItems()).isNull();
 	}
 
 	/**
@@ -252,13 +252,13 @@ public class Items_Test {
 		Items t = new Items();
 
 		t.minItems(123);
-		assertObject(t.minItems()).isType(Integer.class).is(123);
+		assertOptional(t.minItems()).isType(Integer.class).is(123);
 
 		t.minItems("123");
-		assertObject(t.minItems()).isType(Integer.class).is(123);
+		assertOptional(t.minItems()).isType(Integer.class).is(123);
 
 		t.minItems((String)null);
-		assertObject(t.minItems()).isNull();
+		assertOptional(t.minItems()).isNull();
 	}
 
 	/**
@@ -269,13 +269,13 @@ public class Items_Test {
 		Items t = new Items();
 
 		t.uniqueItems(true);
-		assertObject(t.uniqueItems()).isType(Boolean.class).is(true);
+		assertOptional(t.uniqueItems()).isType(Boolean.class).is(true);
 
 		t.uniqueItems("true");
-		assertObject(t.uniqueItems()).isType(Boolean.class).is(true);
+		assertOptional(t.uniqueItems()).isType(Boolean.class).is(true);
 
 		t.uniqueItems((String)null);
-		assertObject(t.uniqueItems()).isNull();
+		assertOptional(t.uniqueItems()).isNull();
 	}
 
 	/**
@@ -286,16 +286,16 @@ public class Items_Test {
 		Items t = new Items();
 
 		t._enum(ASet.of("foo","bar"));
-		assertObject(t._enum()).isType(Set.class).asJson().is("['foo','bar']");
+		assertOptional(t._enum()).isType(Set.class).asJson().is("['foo','bar']");
 
 		t._enum("foo","baz");
-		assertObject(t._enum()).isType(Set.class).asJson().is("['foo','baz']");
+		assertOptional(t._enum()).isType(Set.class).asJson().is("['foo','baz']");
 
 		t._enum(ASet.of());
-		assertObject(t._enum()).isType(Set.class).asJson().is("[]");
+		assertOptional(t._enum()).isType(Set.class).asJson().is("[]");
 
 		t._enum((Collection<Object>)null);
-		assertObject(t._enum()).isNull();
+		assertOptional(t._enum()).isNull();
 
 		t.addEnum(ASet.of("foo","bar"));
 		assertObject(t.getEnum()).isType(Set.class).asJson().is("['foo','bar']");
@@ -315,16 +315,16 @@ public class Items_Test {
 		Items t = new Items();
 
 		t.multipleOf(123);
-		assertObject(t.multipleOf()).isType(Integer.class).is(123);
+		assertOptional(t.multipleOf()).isType(Integer.class).is(123);
 
 		t.multipleOf(123f);
-		assertObject(t.multipleOf()).isType(Float.class).is(123f);
+		assertOptional(t.multipleOf()).isType(Float.class).is(123f);
 
 		t.multipleOf("123");
-		assertObject(t.multipleOf()).isType(Integer.class).is(123);
+		assertOptional(t.multipleOf()).isType(Integer.class).is(123);
 
 		t.multipleOf((String)null);
-		assertObject(t.multipleOf()).isNull();
+		assertOptional(t.multipleOf()).isNull();
 	}
 
 	/**
diff --git a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/License_Test.java b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/License_Test.java
index 653fc32..a7a1350 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/License_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/License_Test.java
@@ -49,16 +49,16 @@ public class License_Test {
 		License t = new License();
 
 		t.url(URI.create("foo"));
-		assertObject(t.url()).isType(URI.class).asString().is("foo");
+		assertOptional(t.url()).isType(URI.class).asString().is("foo");
 
 		t.url("bar");
-		assertObject(t.url()).isType(URI.class).asString().is("bar");
+		assertOptional(t.url()).isType(URI.class).asString().is("bar");
 
 		t.url(new URL("http://baz"));
-		assertObject(t.url()).isType(URI.class).asString().is("http://baz");
+		assertOptional(t.url()).isType(URI.class).asString().is("http://baz");
 
 		t.url((String)null);
-		assertObject(t.url()).isNull();
+		assertOptional(t.url()).isNull();
 	}
 
 	/**
diff --git a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Operation_Test.java b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Operation_Test.java
index 9acaf1e..29b8bc9 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Operation_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Operation_Test.java
@@ -38,25 +38,25 @@ public class Operation_Test {
 		Operation t = new Operation();
 
 		t.tags(ASet.of("foo","bar"));
-		assertObject(t.tags()).isType(Set.class).asJson().is("['foo','bar']");
+		assertOptional(t.tags()).isType(Set.class).asJson().is("['foo','bar']");
 
 		t.tags("bar","baz");
-		assertObject(t.tags()).isType(Set.class).asJson().is("['bar','baz']");
+		assertOptional(t.tags()).isType(Set.class).asJson().is("['bar','baz']");
 
 		t.tags(ASet.of());
-		assertObject(t.tags()).isType(Set.class).asJson().is("[]");
+		assertOptional(t.tags()).isType(Set.class).asJson().is("[]");
 
 		t.tags((Collection<String>)null);
-		assertObject(t.tags()).isNull();
+		assertOptional(t.tags()).isNull();
 
 		t.addTags(ASet.of("foo","bar"));
-		assertObject(t.tags()).isType(Set.class).asJson().is("['foo','bar']");
+		assertOptional(t.tags()).isType(Set.class).asJson().is("['foo','bar']");
 
 		t.addTags(ASet.of());
-		assertObject(t.tags()).isType(Set.class).asJson().is("['foo','bar']");;
+		assertOptional(t.tags()).isType(Set.class).asJson().is("['foo','bar']");;
 
 		t.addTags(null);
-		assertObject(t.tags()).isType(Set.class).asJson().is("['foo','bar']");
+		assertOptional(t.tags()).isType(Set.class).asJson().is("['foo','bar']");
 
 	}
 
@@ -96,13 +96,13 @@ public class Operation_Test {
 		Operation t = new Operation();
 
 		t.externalDocs(externalDocumentation("foo"));
-		assertObject(t.externalDocs()).isType(ExternalDocumentation.class).asJson().is("{url:'foo'}");
+		assertOptional(t.externalDocs()).isType(ExternalDocumentation.class).asJson().is("{url:'foo'}");
 
 		t.externalDocs("{url:'bar'}");
-		assertObject(t.externalDocs()).isType(ExternalDocumentation.class).asJson().is("{url:'bar'}");
+		assertOptional(t.externalDocs()).isType(ExternalDocumentation.class).asJson().is("{url:'bar'}");
 
 		t.externalDocs((String)null);
-		assertObject(t.externalDocs()).isNull();
+		assertOptional(t.externalDocs()).isNull();
 	}
 
 	/**
@@ -127,22 +127,22 @@ public class Operation_Test {
 		Operation t = new Operation();
 
 		t.consumes(ASet.of(MediaType.of("text/foo")));
-		assertObject(t.consumes()).isType(Set.class).asJson().is("['text/foo']");
+		assertOptional(t.consumes()).isType(Set.class).asJson().is("['text/foo']");
 
 		t.consumes(ASet.of());
-		assertObject(t.consumes()).isType(Set.class).asJson().is("[]");
+		assertOptional(t.consumes()).isType(Set.class).asJson().is("[]");
 
 		t.consumes((Collection<MediaType>)null);
-		assertObject(t.consumes()).isNull();
+		assertOptional(t.consumes()).isNull();
 
 		t.addConsumes(ASet.of(MediaType.of("text/foo")));
-		assertObject(t.consumes()).isType(Set.class).asJson().is("['text/foo']");
+		assertOptional(t.consumes()).isType(Set.class).asJson().is("['text/foo']");
 
 		t.addConsumes(ASet.of());
-		assertObject(t.consumes()).isType(Set.class).asJson().is("['text/foo']");
+		assertOptional(t.consumes()).isType(Set.class).asJson().is("['text/foo']");
 
 		t.addConsumes(null);
-		assertObject(t.consumes()).isType(Set.class).asJson().is("['text/foo']");
+		assertOptional(t.consumes()).isType(Set.class).asJson().is("['text/foo']");
 	}
 
 	/**
@@ -153,22 +153,22 @@ public class Operation_Test {
 		Operation t = new Operation();
 
 		t.produces(ASet.of(MediaType.of("text/foo")));
-		assertObject(t.produces()).isType(Set.class).asJson().is("['text/foo']");
+		assertOptional(t.produces()).isType(Set.class).asJson().is("['text/foo']");
 
 		t.produces(ASet.of());
-		assertObject(t.produces()).isType(Set.class).asJson().is("[]");
+		assertOptional(t.produces()).isType(Set.class).asJson().is("[]");
 
 		t.produces((Collection<MediaType>)null);
-		assertObject(t.produces()).isNull();
+		assertOptional(t.produces()).isNull();
 
 		t.addProduces(ASet.of(MediaType.of("text/foo")));
-		assertObject(t.produces()).isType(Set.class).asJson().is("['text/foo']");
+		assertOptional(t.produces()).isType(Set.class).asJson().is("['text/foo']");
 
 		t.addProduces(ASet.of());
-		assertObject(t.produces()).isType(Set.class).asJson().is("['text/foo']");
+		assertOptional(t.produces()).isType(Set.class).asJson().is("['text/foo']");
 
 		t.addProduces(null);
-		assertObject(t.produces()).isType(Set.class).asJson().is("['text/foo']");
+		assertOptional(t.produces()).isType(Set.class).asJson().is("['text/foo']");
 	}
 
 	/**
@@ -179,22 +179,22 @@ public class Operation_Test {
 		Operation t = new Operation();
 
 		t.parameters(ASet.of(parameterInfo("foo","bar")));
-		assertObject(t.parameters()).isType(List.class).asJson().is("[{'in':'foo',name:'bar'}]");
+		assertOptional(t.parameters()).isType(List.class).asJson().is("[{'in':'foo',name:'bar'}]");
 
 		t.parameters(ASet.of());
-		assertObject(t.parameters()).isType(List.class).asJson().is("[]");
+		assertOptional(t.parameters()).isType(List.class).asJson().is("[]");
 
 		t.parameters((Collection<ParameterInfo>)null);
-		assertObject(t.parameters()).isNull();
+		assertOptional(t.parameters()).isNull();
 
 		t.addParameters(ASet.of(parameterInfo("foo","bar")));
-		assertObject(t.parameters()).isType(List.class).asJson().is("[{'in':'foo',name:'bar'}]");;
+		assertOptional(t.parameters()).isType(List.class).asJson().is("[{'in':'foo',name:'bar'}]");;
 
 		t.addParameters(ASet.of());
-		assertObject(t.parameters()).isType(List.class).asJson().is("[{'in':'foo',name:'bar'}]");
+		assertOptional(t.parameters()).isType(List.class).asJson().is("[{'in':'foo',name:'bar'}]");
 
 		t.addParameters(null);
-		assertObject(t.parameters()).isType(List.class).asJson().is("[{'in':'foo',name:'bar'}]");
+		assertOptional(t.parameters()).isType(List.class).asJson().is("[{'in':'foo',name:'bar'}]");
 	}
 
 	/**
@@ -205,22 +205,22 @@ public class Operation_Test {
 		Operation t = new Operation();
 
 		t.responses(AMap.of("123",responseInfo("bar")));
-		assertObject(t.responses()).isType(Map.class).asJson().is("{'123':{description:'bar'}}");
+		assertOptional(t.responses()).isType(Map.class).asJson().is("{'123':{description:'bar'}}");
 
 		t.responses(AMap.create());
-		assertObject(t.responses()).isType(Map.class).asJson().is("{}");
+		assertOptional(t.responses()).isType(Map.class).asJson().is("{}");
 
 		t.responses((Map<String,ResponseInfo>)null);
-		assertObject(t.responses()).isNull();
+		assertOptional(t.responses()).isNull();
 
 		t.addResponses(AMap.of("123",responseInfo("bar")));
-		assertObject(t.responses()).isType(Map.class).asJson().is("{'123':{description:'bar'}}");
+		assertOptional(t.responses()).isType(Map.class).asJson().is("{'123':{description:'bar'}}");
 
 		t.addResponses(AMap.create());
-		assertObject(t.responses()).isType(Map.class).asJson().is("{'123':{description:'bar'}}");
+		assertOptional(t.responses()).isType(Map.class).asJson().is("{'123':{description:'bar'}}");
 
 		t.addResponses(null);
-		assertObject(t.responses()).isType(Map.class).asJson().is("{'123':{description:'bar'}}");
+		assertOptional(t.responses()).isType(Map.class).asJson().is("{'123':{description:'bar'}}");
 	}
 
 	/**
@@ -231,22 +231,22 @@ public class Operation_Test {
 		Operation t = new Operation();
 
 		t.schemes(ASet.of("foo"));
-		assertObject(t.schemes()).isType(Set.class).asJson().is("['foo']");
+		assertOptional(t.schemes()).isType(Set.class).asJson().is("['foo']");
 
 		t.schemes(ASet.of());
-		assertObject(t.schemes()).isType(Set.class).asJson().is("[]");
+		assertOptional(t.schemes()).isType(Set.class).asJson().is("[]");
 
 		t.schemes((Set<String>)null);
-		assertObject(t.schemes()).isNull();
+		assertOptional(t.schemes()).isNull();
 
 		t.addSchemes(ASet.of("foo"));
-		assertObject(t.schemes()).isType(Set.class).asJson().is("['foo']");
+		assertOptional(t.schemes()).isType(Set.class).asJson().is("['foo']");
 
 		t.addSchemes(ASet.of());
-		assertObject(t.schemes()).isType(Set.class).asJson().is("['foo']");
+		assertOptional(t.schemes()).isType(Set.class).asJson().is("['foo']");
 
 		t.addSchemes(null);
-		assertObject(t.schemes()).isType(Set.class).asJson().is("['foo']");
+		assertOptional(t.schemes()).isType(Set.class).asJson().is("['foo']");
 	}
 
 	/**
@@ -257,22 +257,22 @@ public class Operation_Test {
 		Operation t = new Operation();
 
 		t.security(AList.of(AMap.of("foo",AList.of("bar"))));
-		assertObject(t.security()).isType(List.class).asJson().is("[{foo:['bar']}]");
+		assertOptional(t.security()).isType(List.class).asJson().is("[{foo:['bar']}]");
 
 		t.security(AList.of());
-		assertObject(t.security()).isType(List.class).asJson().is("[]");
+		assertOptional(t.security()).isType(List.class).asJson().is("[]");
 
 		t.security((List<Map<String,List<String>>>)null);
-		assertObject(t.security()).isNull();
+		assertOptional(t.security()).isNull();
 
 		t.addSecurity(ASet.of(AMap.of("foo",AList.of("bar"))));
-		assertObject(t.security()).isType(List.class).asJson().is("[{foo:['bar']}]");
+		assertOptional(t.security()).isType(List.class).asJson().is("[{foo:['bar']}]");
 
 		t.addSecurity(ASet.of());
-		assertObject(t.security()).isType(List.class).asJson().is("[{foo:['bar']}]");
+		assertOptional(t.security()).isType(List.class).asJson().is("[{foo:['bar']}]");
 
 		t.addSecurity(null);
-		assertObject(t.security()).isType(List.class).asJson().is("[{foo:['bar']}]");
+		assertOptional(t.security()).isType(List.class).asJson().is("[{foo:['bar']}]");
 	}
 
 	/**
@@ -283,13 +283,13 @@ public class Operation_Test {
 		Operation t = new Operation();
 
 		t.deprecated(true);
-		assertObject(t.deprecated()).isType(Boolean.class).is(true);
+		assertOptional(t.deprecated()).isType(Boolean.class).is(true);
 
 		t.deprecated("true");
-		assertObject(t.deprecated()).isType(Boolean.class).is(true);
+		assertOptional(t.deprecated()).isType(Boolean.class).is(true);
 
 		t.deprecated((String)null);
-		assertObject(t.deprecated()).isNull();
+		assertOptional(t.deprecated()).isNull();
 	}
 
 	/**
diff --git a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ParameterInfo_Test.java b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ParameterInfo_Test.java
index e33eb15..3edfec3 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ParameterInfo_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ParameterInfo_Test.java
@@ -40,7 +40,7 @@ public class ParameterInfo_Test {
 		assertString(t.name()).is("foo");
 
 		t.name(null);
-		assertString(t.name()).isNull();
+		assertOptional(t.name()).isNull();
 	}
 
 	/**
@@ -79,13 +79,13 @@ public class ParameterInfo_Test {
 		ParameterInfo t = new ParameterInfo();
 
 		t.required(true);
-		assertObject(t.required()).isType(Boolean.class).is(true);
+		assertOptional(t.required()).isType(Boolean.class).is(true);
 
 		t.required("true");
-		assertObject(t.required()).isType(Boolean.class).is(true);
+		assertOptional(t.required()).isType(Boolean.class).is(true);
 
 		t.required((String)null);
-		assertObject(t.required()).isNull();
+		assertOptional(t.required()).isNull();
 	}
 
 	/**
@@ -96,13 +96,13 @@ public class ParameterInfo_Test {
 		ParameterInfo t = new ParameterInfo();
 
 		t.schema(schemaInfo().title("foo"));
-		assertObject(t.schema()).asJson().is("{title:'foo'}");
+		assertOptional(t.schema()).asJson().is("{title:'foo'}");
 
 		t.schema("{title:'foo'}");
-		assertObject(t.schema()).isType(SchemaInfo.class).asJson().is("{title:'foo'}");
+		assertOptional(t.schema()).isType(SchemaInfo.class).asJson().is("{title:'foo'}");
 
 		t.schema((String)null);
-		assertObject(t.schema()).isNull();
+		assertOptional(t.schema()).isNull();
 	}
 
 	/**
@@ -141,13 +141,13 @@ public class ParameterInfo_Test {
 		ParameterInfo t = new ParameterInfo();
 
 		t.allowEmptyValue(true);
-		assertObject(t.allowEmptyValue()).isType(Boolean.class).is(true);
+		assertOptional(t.allowEmptyValue()).isType(Boolean.class).is(true);
 
 		t.allowEmptyValue("true");
-		assertObject(t.allowEmptyValue()).isType(Boolean.class).is(true);
+		assertOptional(t.allowEmptyValue()).isType(Boolean.class).is(true);
 
 		t.allowEmptyValue((String)null);
-		assertObject(t.allowEmptyValue()).isNull();
+		assertOptional(t.allowEmptyValue()).isNull();
 	}
 
 	/**
@@ -158,13 +158,13 @@ public class ParameterInfo_Test {
 		ParameterInfo t = new ParameterInfo();
 
 		t.items(items("foo"));
-		assertObject(t.items()).asJson().is("{type:'foo'}");
+		assertOptional(t.items()).asJson().is("{type:'foo'}");
 
 		t.items("{type:'foo'}");
-		assertObject(t.items()).isType(Items.class).asJson().is("{type:'foo'}");
+		assertOptional(t.items()).isType(Items.class).asJson().is("{type:'foo'}");
 
 		t.items((String)null);
-		assertObject(t.items()).isNull();
+		assertOptional(t.items()).isNull();
 	}
 
 	/**
@@ -192,10 +192,10 @@ public class ParameterInfo_Test {
 		assertString(t._default()).is("foo");
 
 		t._default(new StringBuilder("foo"));
-		assertObject(t._default()).isType(StringBuilder.class).asString().is("foo");
+		assertOptional(t._default()).isType(StringBuilder.class).asString().is("foo");
 
 		t._default(null);
-		assertObject(t._default()).isNull();
+		assertOptional(t._default()).isNull();
 	}
 
 	/**
@@ -206,16 +206,16 @@ public class ParameterInfo_Test {
 		ParameterInfo t = new ParameterInfo();
 
 		t.maximum(123);
-		assertObject(t.maximum()).isType(Integer.class).is(123);
+		assertOptional(t.maximum()).isType(Integer.class).is(123);
 
 		t.maximum(123f);
-		assertObject(t.maximum()).isType(Float.class).is(123f);
+		assertOptional(t.maximum()).isType(Float.class).is(123f);
 
 		t.maximum("123");
-		assertObject(t.maximum()).isType(Integer.class).is(123);
+		assertOptional(t.maximum()).isType(Integer.class).is(123);
 
 		t.maximum((String)null);
-		assertObject(t.maximum()).isNull();
+		assertOptional(t.maximum()).isNull();
 	}
 
 	/**
@@ -226,13 +226,13 @@ public class ParameterInfo_Test {
 		ParameterInfo t = new ParameterInfo();
 
 		t.exclusiveMaximum(true);
-		assertObject(t.exclusiveMaximum()).isType(Boolean.class).is(true);
+		assertOptional(t.exclusiveMaximum()).isType(Boolean.class).is(true);
 
 		t.exclusiveMaximum("true");
-		assertObject(t.exclusiveMaximum()).isType(Boolean.class).is(true);
+		assertOptional(t.exclusiveMaximum()).isType(Boolean.class).is(true);
 
 		t.exclusiveMaximum((String)null);
-		assertObject(t.exclusiveMaximum()).isNull();
+		assertOptional(t.exclusiveMaximum()).isNull();
 	}
 
 	/**
@@ -243,16 +243,16 @@ public class ParameterInfo_Test {
 		ParameterInfo t = new ParameterInfo();
 
 		t.minimum(123);
-		assertObject(t.minimum()).isType(Integer.class).is(123);
+		assertOptional(t.minimum()).isType(Integer.class).is(123);
 
 		t.minimum(123f);
-		assertObject(t.minimum()).isType(Float.class).is(123f);
+		assertOptional(t.minimum()).isType(Float.class).is(123f);
 
 		t.minimum("123");
-		assertObject(t.minimum()).isType(Integer.class).is(123);
+		assertOptional(t.minimum()).isType(Integer.class).is(123);
 
 		t.minimum((String)null);
-		assertObject(t.minimum()).isNull();
+		assertOptional(t.minimum()).isNull();
 	}
 
 	/**
@@ -263,13 +263,13 @@ public class ParameterInfo_Test {
 		ParameterInfo t = new ParameterInfo();
 
 		t.exclusiveMinimum(true);
-		assertObject(t.exclusiveMinimum()).isType(Boolean.class).is(true);
+		assertOptional(t.exclusiveMinimum()).isType(Boolean.class).is(true);
 
 		t.exclusiveMinimum("true");
-		assertObject(t.exclusiveMinimum()).isType(Boolean.class).is(true);
+		assertOptional(t.exclusiveMinimum()).isType(Boolean.class).is(true);
 
 		t.exclusiveMinimum((String)null);
-		assertObject(t.exclusiveMinimum()).isNull();
+		assertOptional(t.exclusiveMinimum()).isNull();
 	}
 
 	/**
@@ -280,13 +280,13 @@ public class ParameterInfo_Test {
 		ParameterInfo t = new ParameterInfo();
 
 		t.maxLength(123);
-		assertObject(t.maxLength()).isType(Integer.class).is(123);
+		assertOptional(t.maxLength()).isType(Integer.class).is(123);
 
 		t.maxLength("123");
-		assertObject(t.maxLength()).isType(Integer.class).is(123);
+		assertOptional(t.maxLength()).isType(Integer.class).is(123);
 
 		t.maxLength((String)null);
-		assertObject(t.maxLength()).isNull();
+		assertOptional(t.maxLength()).isNull();
 	}
 
 	/**
@@ -297,13 +297,13 @@ public class ParameterInfo_Test {
 		ParameterInfo t = new ParameterInfo();
 
 		t.minLength(123);
-		assertObject(t.minLength()).isType(Integer.class).is(123);
+		assertOptional(t.minLength()).isType(Integer.class).is(123);
 
 		t.minLength("123");
-		assertObject(t.minLength()).isType(Integer.class).is(123);
+		assertOptional(t.minLength()).isType(Integer.class).is(123);
 
 		t.minLength((String)null);
-		assertObject(t.minLength()).isNull();
+		assertOptional(t.minLength()).isNull();
 	}
 
 	/**
@@ -328,13 +328,13 @@ public class ParameterInfo_Test {
 		ParameterInfo t = new ParameterInfo();
 
 		t.maxItems(123);
-		assertObject(t.maxItems()).isType(Integer.class).is(123);
+		assertOptional(t.maxItems()).isType(Integer.class).is(123);
 
 		t.maxItems("123");
-		assertObject(t.maxItems()).isType(Integer.class).is(123);
+		assertOptional(t.maxItems()).isType(Integer.class).is(123);
 
 		t.maxItems((String)null);
-		assertObject(t.maxItems()).isNull();
+		assertOptional(t.maxItems()).isNull();
 	}
 
 	/**
@@ -345,13 +345,13 @@ public class ParameterInfo_Test {
 		ParameterInfo t = new ParameterInfo();
 
 		t.minItems(123);
-		assertObject(t.minItems()).isType(Integer.class).is(123);
+		assertOptional(t.minItems()).isType(Integer.class).is(123);
 
 		t.minItems("123");
-		assertObject(t.minItems()).isType(Integer.class).is(123);
+		assertOptional(t.minItems()).isType(Integer.class).is(123);
 
 		t.minItems((String)null);
-		assertObject(t.minItems()).isNull();
+		assertOptional(t.minItems()).isNull();
 	}
 
 	/**
@@ -362,13 +362,13 @@ public class ParameterInfo_Test {
 		ParameterInfo t = new ParameterInfo();
 
 		t.uniqueItems(true);
-		assertObject(t.uniqueItems()).isType(Boolean.class).is(true);
+		assertOptional(t.uniqueItems()).isType(Boolean.class).is(true);
 
 		t.uniqueItems("true");
-		assertObject(t.uniqueItems()).isType(Boolean.class).is(true);
+		assertOptional(t.uniqueItems()).isType(Boolean.class).is(true);
 
 		t.uniqueItems((String)null);
-		assertObject(t.uniqueItems()).isNull();
+		assertOptional(t.uniqueItems()).isNull();
 	}
 
 	/**
@@ -379,22 +379,22 @@ public class ParameterInfo_Test {
 		ParameterInfo t = new ParameterInfo();
 
 		t._enum(ASet.of("foo","bar"));
-		assertObject(t._enum()).isType(Set.class).asJson().is("['foo','bar']");
+		assertOptional(t._enum()).isType(Set.class).asJson().is("['foo','bar']");
 
 		t._enum(ASet.of());
-		assertObject(t._enum()).isType(Set.class).asJson().is("[]");
+		assertOptional(t._enum()).isType(Set.class).asJson().is("[]");
 
 		t._enum((Collection<Object>)null);
-		assertObject(t._enum()).isNull();
+		assertOptional(t._enum()).isNull();
 
 		t.addEnum(ASet.of("foo","bar"));
-		assertObject(t._enum()).isType(Set.class).asJson().is("['foo','bar']");
+		assertOptional(t._enum()).isType(Set.class).asJson().is("['foo','bar']");
 
 		t.addEnum(ASet.of("baz"));
-		assertObject(t._enum()).isType(Set.class).asJson().is("['foo','bar','baz']");
+		assertOptional(t._enum()).isType(Set.class).asJson().is("['foo','bar','baz']");
 
 		t.addEnum(null);
-		assertObject(t._enum()).isType(Set.class).asJson().is("['foo','bar','baz']");
+		assertOptional(t._enum()).isType(Set.class).asJson().is("['foo','bar','baz']");
 	}
 
 	/**
@@ -405,16 +405,16 @@ public class ParameterInfo_Test {
 		ParameterInfo t = new ParameterInfo();
 
 		t.multipleOf(123);
-		assertObject(t.multipleOf()).isType(Integer.class).is(123);
+		assertOptional(t.multipleOf()).isType(Integer.class).is(123);
 
 		t.multipleOf(123f);
-		assertObject(t.multipleOf()).isType(Float.class).is(123f);
+		assertOptional(t.multipleOf()).isType(Float.class).is(123f);
 
 		t.multipleOf("123");
-		assertObject(t.multipleOf()).isType(Integer.class).is(123);
+		assertOptional(t.multipleOf()).isType(Integer.class).is(123);
 
 		t.multipleOf((String)null);
-		assertObject(t.multipleOf()).isNull();
+		assertOptional(t.multipleOf()).isNull();
 	}
 
 	/**
diff --git a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ResponseInfo_Test.java b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ResponseInfo_Test.java
index eee69df..32cbe51 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ResponseInfo_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/ResponseInfo_Test.java
@@ -51,13 +51,13 @@ public class ResponseInfo_Test {
 		ResponseInfo t = new ResponseInfo();
 
 		t.schema(schemaInfo().title("foo"));
-		assertObject(t.schema()).isType(SchemaInfo.class).asJson().is("{title:'foo'}");
+		assertOptional(t.schema()).isType(SchemaInfo.class).asJson().is("{title:'foo'}");
 
 		t.schema("{title:'foo'}");
-		assertObject(t.schema()).isType(SchemaInfo.class).asJson().is("{title:'foo'}");
+		assertOptional(t.schema()).isType(SchemaInfo.class).asJson().is("{title:'foo'}");
 
 		t.schema((String)null);
-		assertObject(t.schema()).isNull();
+		assertOptional(t.schema()).isNull();
 	}
 
 	/**
@@ -68,25 +68,25 @@ public class ResponseInfo_Test {
 		ResponseInfo t = new ResponseInfo();
 
 		t.headers(AMap.of("foo",headerInfo("bar")));
-		assertObject(t.headers()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
+		assertOptional(t.headers()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
 		assertObject(t.headers().get().get("foo")).isType(HeaderInfo.class);
 
 		t.headers(AMap.create());
-		assertObject(t.headers()).isType(Map.class).asJson().is("{}");
+		assertOptional(t.headers()).isType(Map.class).asJson().is("{}");
 
 		t.headers((Map<String,HeaderInfo>)null);
-		assertObject(t.headers()).isNull();
+		assertOptional(t.headers()).isNull();
 
 		t.addHeaders(AMap.of("foo",headerInfo("bar")));
-		assertObject(t.headers()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
+		assertOptional(t.headers()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
 		assertObject(t.headers().get().get("foo")).isType(HeaderInfo.class);
 
 		t.addHeaders(AMap.create());
-		assertObject(t.headers()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
+		assertOptional(t.headers()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
 		assertObject(t.headers().get().get("foo")).isType(HeaderInfo.class);
 
 		t.addHeaders(null);
-		assertObject(t.headers()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
+		assertOptional(t.headers()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
 		assertObject(t.headers().get().get("foo")).isType(HeaderInfo.class);
 	}
 
@@ -98,29 +98,29 @@ public class ResponseInfo_Test {
 		ResponseInfo t = new ResponseInfo();
 
 		t.examples(AMap.of("foo","bar","baz",AList.of("qux")));
-		assertObject(t.examples()).isType(Map.class).asJson().is("{foo:'bar',baz:['qux']}");
+		assertOptional(t.examples()).isType(Map.class).asJson().is("{foo:'bar',baz:['qux']}");
 
 		t.examples(AMap.create());
-		assertObject(t.examples()).isType(Map.class).asJson().is("{}");
+		assertOptional(t.examples()).isType(Map.class).asJson().is("{}");
 
 		t.examples((Map<String,Object>)null);
-		assertObject(t.examples()).isNull();
+		assertOptional(t.examples()).isNull();
 
 		t.addExamples(AMap.of("foo","bar","baz",AList.of("qux")));
-		assertObject(t.examples()).isType(Map.class).asJson().is("{foo:'bar',baz:['qux']}");
+		assertOptional(t.examples()).isType(Map.class).asJson().is("{foo:'bar',baz:['qux']}");
 
 		t.addExamples(AMap.create());
-		assertObject(t.examples()).isType(Map.class).asJson().is("{foo:'bar',baz:['qux']}");
+		assertOptional(t.examples()).isType(Map.class).asJson().is("{foo:'bar',baz:['qux']}");
 
 		t.addExamples(null);
-		assertObject(t.examples()).isType(Map.class).asJson().is("{foo:'bar',baz:['qux']}");
+		assertOptional(t.examples()).isType(Map.class).asJson().is("{foo:'bar',baz:['qux']}");
 
 		t.examples(AMap.create());
 		t.example("text/a", "a");
 		t.example("text/b", null);
 		t.example(null, "c");
 
-		assertObject(t.examples()).asJson().is("{'text/a':'a','text/b':null,null:'c'}");
+		assertOptional(t.examples()).asJson().is("{'text/a':'a','text/b':null,null:'c'}");
 	}
 
 	/**
diff --git a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/SchemaInfo_Test.java b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/SchemaInfo_Test.java
index 7bd016d..87adf5c 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/SchemaInfo_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/SchemaInfo_Test.java
@@ -82,10 +82,10 @@ public class SchemaInfo_Test {
 		assertString(t._default()).is("foo");
 
 		t._default(new StringBuilder("foo"));
-		assertObject(t._default()).isType(StringBuilder.class).asString().is("foo");
+		assertOptional(t._default()).isType(StringBuilder.class).asString().is("foo");
 
 		t._default(null);
-		assertObject(t._default()).isNull();
+		assertOptional(t._default()).isNull();
 	}
 
 	/**
@@ -96,16 +96,16 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.multipleOf(123);
-		assertObject(t.multipleOf()).isType(Integer.class).is(123);
+		assertOptional(t.multipleOf()).isType(Integer.class).is(123);
 
 		t.multipleOf(123f);
-		assertObject(t.multipleOf()).isType(Float.class).is(123f);
+		assertOptional(t.multipleOf()).isType(Float.class).is(123f);
 
 		t.multipleOf("123");
-		assertObject(t.multipleOf()).isType(Integer.class).is(123);
+		assertOptional(t.multipleOf()).isType(Integer.class).is(123);
 
 		t.multipleOf((String)null);
-		assertObject(t.multipleOf()).isNull();
+		assertOptional(t.multipleOf()).isNull();
 	}
 
 	/**
@@ -116,16 +116,16 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.maximum(123);
-		assertObject(t.maximum()).isType(Integer.class).is(123);
+		assertOptional(t.maximum()).isType(Integer.class).is(123);
 
 		t.maximum(123f);
-		assertObject(t.maximum()).isType(Float.class).is(123f);
+		assertOptional(t.maximum()).isType(Float.class).is(123f);
 
 		t.maximum("123");
-		assertObject(t.maximum()).isType(Integer.class).is(123);
+		assertOptional(t.maximum()).isType(Integer.class).is(123);
 
 		t.maximum((String)null);
-		assertObject(t.maximum()).isNull();
+		assertOptional(t.maximum()).isNull();
 	}
 
 	/**
@@ -136,13 +136,13 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.exclusiveMaximum(true);
-		assertObject(t.exclusiveMaximum()).isType(Boolean.class).is(true);
+		assertOptional(t.exclusiveMaximum()).isType(Boolean.class).is(true);
 
 		t.exclusiveMaximum("true");
-		assertObject(t.exclusiveMaximum()).isType(Boolean.class).is(true);
+		assertOptional(t.exclusiveMaximum()).isType(Boolean.class).is(true);
 
 		t.exclusiveMaximum((String)null);
-		assertObject(t.exclusiveMaximum()).isNull();
+		assertOptional(t.exclusiveMaximum()).isNull();
 	}
 
 	/**
@@ -153,16 +153,16 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.minimum(123);
-		assertObject(t.minimum()).isType(Integer.class).is(123);
+		assertOptional(t.minimum()).isType(Integer.class).is(123);
 
 		t.minimum(123f);
-		assertObject(t.minimum()).isType(Float.class).is(123f);
+		assertOptional(t.minimum()).isType(Float.class).is(123f);
 
 		t.minimum("123");
-		assertObject(t.minimum()).isType(Integer.class).is(123);
+		assertOptional(t.minimum()).isType(Integer.class).is(123);
 
 		t.minimum((String)null);
-		assertObject(t.minimum()).isNull();
+		assertOptional(t.minimum()).isNull();
 	}
 
 	/**
@@ -173,13 +173,13 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.exclusiveMinimum(true);
-		assertObject(t.exclusiveMinimum()).isType(Boolean.class).is(true);
+		assertOptional(t.exclusiveMinimum()).isType(Boolean.class).is(true);
 
 		t.exclusiveMinimum("true");
-		assertObject(t.exclusiveMinimum()).isType(Boolean.class).is(true);
+		assertOptional(t.exclusiveMinimum()).isType(Boolean.class).is(true);
 
 		t.exclusiveMinimum((String)null);
-		assertObject(t.exclusiveMinimum()).isNull();
+		assertOptional(t.exclusiveMinimum()).isNull();
 	}
 
 	/**
@@ -190,13 +190,13 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.maxLength(123);
-		assertObject(t.maxLength()).isType(Integer.class).is(123);
+		assertOptional(t.maxLength()).isType(Integer.class).is(123);
 
 		t.maxLength("123");
-		assertObject(t.maxLength()).isType(Integer.class).is(123);
+		assertOptional(t.maxLength()).isType(Integer.class).is(123);
 
 		t.maxLength((String)null);
-		assertObject(t.maxLength()).isNull();
+		assertOptional(t.maxLength()).isNull();
 	}
 
 	/**
@@ -207,13 +207,13 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.minLength(123);
-		assertObject(t.minLength()).isType(Integer.class).is(123);
+		assertOptional(t.minLength()).isType(Integer.class).is(123);
 
 		t.minLength("123");
-		assertObject(t.minLength()).isType(Integer.class).is(123);
+		assertOptional(t.minLength()).isType(Integer.class).is(123);
 
 		t.minLength((String)null);
-		assertObject(t.minLength()).isNull();
+		assertOptional(t.minLength()).isNull();
 	}
 
 	/**
@@ -238,13 +238,13 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.maxItems(123);
-		assertObject(t.maxItems()).isType(Integer.class).is(123);
+		assertOptional(t.maxItems()).isType(Integer.class).is(123);
 
 		t.maxItems("123");
-		assertObject(t.maxItems()).isType(Integer.class).is(123);
+		assertOptional(t.maxItems()).isType(Integer.class).is(123);
 
 		t.maxItems((String)null);
-		assertObject(t.maxItems()).isNull();
+		assertOptional(t.maxItems()).isNull();
 	}
 
 	/**
@@ -255,13 +255,13 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.minItems(123);
-		assertObject(t.minItems()).isType(Integer.class).is(123);
+		assertOptional(t.minItems()).isType(Integer.class).is(123);
 
 		t.minItems("123");
-		assertObject(t.minItems()).isType(Integer.class).is(123);
+		assertOptional(t.minItems()).isType(Integer.class).is(123);
 
 		t.minItems((String)null);
-		assertObject(t.minItems()).isNull();
+		assertOptional(t.minItems()).isNull();
 	}
 
 	/**
@@ -272,13 +272,13 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.uniqueItems(true);
-		assertObject(t.uniqueItems()).isType(Boolean.class).is(true);
+		assertOptional(t.uniqueItems()).isType(Boolean.class).is(true);
 
 		t.uniqueItems("true");
-		assertObject(t.uniqueItems()).isType(Boolean.class).is(true);
+		assertOptional(t.uniqueItems()).isType(Boolean.class).is(true);
 
 		t.uniqueItems((String)null);
-		assertObject(t.uniqueItems()).isNull();
+		assertOptional(t.uniqueItems()).isNull();
 	}
 
 	/**
@@ -289,13 +289,13 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.maxProperties(123);
-		assertObject(t.maxProperties()).isType(Integer.class).is(123);
+		assertOptional(t.maxProperties()).isType(Integer.class).is(123);
 
 		t.maxProperties("123");
-		assertObject(t.maxProperties()).isType(Integer.class).is(123);
+		assertOptional(t.maxProperties()).isType(Integer.class).is(123);
 
 		t.maxProperties((String)null);
-		assertObject(t.maxProperties()).isNull();
+		assertOptional(t.maxProperties()).isNull();
 	}
 
 	/**
@@ -306,13 +306,13 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.minProperties(123);
-		assertObject(t.minProperties()).isType(Integer.class).is(123);
+		assertOptional(t.minProperties()).isType(Integer.class).is(123);
 
 		t.minProperties("123");
-		assertObject(t.minProperties()).isType(Integer.class).is(123);
+		assertOptional(t.minProperties()).isType(Integer.class).is(123);
 
 		t.minProperties((String)null);
-		assertObject(t.minProperties()).isNull();
+		assertOptional(t.minProperties()).isNull();
 	}
 
 	/**
@@ -323,10 +323,10 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.required("['x']");
-		assertObject(t.required()).isType(Set.class).asJson().is("['x']");
+		assertOptional(t.required()).isType(Set.class).asJson().is("['x']");
 
 		t.setRequired(null);
-		assertObject(t.required()).isNull();
+		assertOptional(t.required()).isNull();
 	}
 
 	/**
@@ -337,22 +337,22 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t._enum(ASet.of("foo","bar"));
-		assertObject(t._enum()).isType(Set.class).asJson().is("['foo','bar']");
+		assertOptional(t._enum()).isType(Set.class).asJson().is("['foo','bar']");
 
 		t._enum(ASet.of());
-		assertObject(t._enum()).isType(Set.class).asJson().is("[]");
+		assertOptional(t._enum()).isType(Set.class).asJson().is("[]");
 
 		t._enum((Collection<Object>)null);
-		assertObject(t._enum()).isNull();
+		assertOptional(t._enum()).isNull();
 
 		t.addEnum(ASet.of("foo","bar"));
-		assertObject(t._enum()).isType(Set.class).asJson().is("['foo','bar']");
+		assertOptional(t._enum()).isType(Set.class).asJson().is("['foo','bar']");
 
 		t.addEnum(ASet.of("baz"));
-		assertObject(t._enum()).isType(Set.class).asJson().is("['foo','bar','baz']");
+		assertOptional(t._enum()).isType(Set.class).asJson().is("['foo','bar','baz']");
 
 		t.addEnum(null);
-		assertObject(t._enum()).isType(Set.class).asJson().is("['foo','bar','baz']");
+		assertOptional(t._enum()).isType(Set.class).asJson().is("['foo','bar','baz']");
 	}
 
 	/**
@@ -377,13 +377,13 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.items(items("foo"));
-		assertObject(t.items()).asJson().is("{type:'foo'}");
+		assertOptional(t.items()).asJson().is("{type:'foo'}");
 
 		t.items("{type:'foo'}");
-		assertObject(t.items()).isType(Items.class).asJson().is("{type:'foo'}");
+		assertOptional(t.items()).isType(Items.class).asJson().is("{type:'foo'}");
 
 		t.items((String)null);
-		assertObject(t.items()).isNull();
+		assertOptional(t.items()).isNull();
 	}
 
 	/**
@@ -394,22 +394,22 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.allOf(ASet.of("foo","bar"));
-		assertObject(t.allOf()).isType(Set.class).asJson().is("['foo','bar']");
+		assertOptional(t.allOf()).isType(Set.class).asJson().is("['foo','bar']");
 
 		t.allOf(ASet.of());
-		assertObject(t.allOf()).isType(Set.class).asJson().is("[]");
+		assertOptional(t.allOf()).isType(Set.class).asJson().is("[]");
 
 		t.allOf((Collection<Object>)null);
-		assertObject(t.allOf()).isNull();
+		assertOptional(t.allOf()).isNull();
 
 		t.addAllOf(ASet.of("foo","bar"));
-		assertObject(t.allOf()).isType(Set.class).asJson().is("['foo','bar']");
+		assertOptional(t.allOf()).isType(Set.class).asJson().is("['foo','bar']");
 
 		t.addAllOf(ASet.of());
-		assertObject(t.allOf()).isType(Set.class).asJson().is("['foo','bar']");
+		assertOptional(t.allOf()).isType(Set.class).asJson().is("['foo','bar']");
 
 		t.addAllOf(null);
-		assertObject(t.allOf()).isType(Set.class).asJson().is("['foo','bar']");
+		assertOptional(t.allOf()).isType(Set.class).asJson().is("['foo','bar']");
 	}
 
 	/**
@@ -420,22 +420,22 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.properties(AMap.of("foo",new SchemaInfo().type("foo")));
-		assertObject(t.properties()).isType(Map.class).asJson().is("{foo:{type:'foo'}}");
+		assertOptional(t.properties()).isType(Map.class).asJson().is("{foo:{type:'foo'}}");
 
 		t.properties(AMap.create());
-		assertObject(t.properties()).isType(Map.class).asJson().is("{}");
+		assertOptional(t.properties()).isType(Map.class).asJson().is("{}");
 
 		t.properties((Map<String,SchemaInfo>)null);
-		assertObject(t.properties()).isNull();
+		assertOptional(t.properties()).isNull();
 
 		t.addProperties(AMap.of("foo", new SchemaInfo().type("foo")));
-		assertObject(t.properties()).isType(Map.class).asJson().is("{foo:{type:'foo'}}");
+		assertOptional(t.properties()).isType(Map.class).asJson().is("{foo:{type:'foo'}}");
 
 		t.addProperties(AMap.create());
-		assertObject(t.properties()).isType(Map.class).asJson().is("{foo:{type:'foo'}}");
+		assertOptional(t.properties()).isType(Map.class).asJson().is("{foo:{type:'foo'}}");
 
 		t.addProperties(null);
-		assertObject(t.properties()).isType(Map.class).asJson().is("{foo:{type:'foo'}}");
+		assertOptional(t.properties()).isType(Map.class).asJson().is("{foo:{type:'foo'}}");
 	}
 
 	/**
@@ -446,13 +446,13 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.additionalProperties(new SchemaInfo().type("foo"));
-		assertObject(t.additionalProperties()).isType(SchemaInfo.class).asJson().is("{type:'foo'}");
+		assertOptional(t.additionalProperties()).isType(SchemaInfo.class).asJson().is("{type:'foo'}");
 
 		t.additionalProperties(new SchemaInfo());
-		assertObject(t.additionalProperties()).isType(SchemaInfo.class).asJson().is("{}");
+		assertOptional(t.additionalProperties()).isType(SchemaInfo.class).asJson().is("{}");
 
 		t.additionalProperties((SchemaInfo)null);
-		assertObject(t.additionalProperties()).isNull();
+		assertOptional(t.additionalProperties()).isNull();
 	}
 
 	/**
@@ -477,13 +477,13 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.readOnly(true);
-		assertObject(t.readOnly()).isType(Boolean.class).is(true);
+		assertOptional(t.readOnly()).isType(Boolean.class).is(true);
 
 		t.readOnly("true");
-		assertObject(t.readOnly()).isType(Boolean.class).is(true);
+		assertOptional(t.readOnly()).isType(Boolean.class).is(true);
 
 		t.readOnly((String)null);
-		assertObject(t.readOnly()).isNull();
+		assertOptional(t.readOnly()).isNull();
 	}
 
 	/**
@@ -494,13 +494,13 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.xml(xml().name("foo"));
-		assertObject(t.xml()).asJson().is("{name:'foo'}");
+		assertOptional(t.xml()).asJson().is("{name:'foo'}");
 
 		t.xml("{name:'foo'}");
-		assertObject(t.xml()).isType(Xml.class).asJson().is("{name:'foo'}");
+		assertOptional(t.xml()).isType(Xml.class).asJson().is("{name:'foo'}");
 
 		t.xml((String)null);
-		assertObject(t.xml()).isNull();
+		assertOptional(t.xml()).isNull();
 	}
 
 	/**
@@ -511,13 +511,13 @@ public class SchemaInfo_Test {
 		SchemaInfo t = new SchemaInfo();
 
 		t.externalDocs(externalDocumentation("foo"));
-		assertObject(t.externalDocs()).asJson().is("{url:'foo'}");
+		assertOptional(t.externalDocs()).asJson().is("{url:'foo'}");
 
 		t.externalDocs("{url:'foo'}");
-		assertObject(t.externalDocs()).isType(ExternalDocumentation.class).asJson().is("{url:'foo'}");
+		assertOptional(t.externalDocs()).isType(ExternalDocumentation.class).asJson().is("{url:'foo'}");
 
 		t.externalDocs((String)null);
-		assertObject(t.externalDocs()).isNull();
+		assertOptional(t.externalDocs()).isNull();
 	}
 
 	/**
diff --git a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/SecurityScheme_Test.java b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/SecurityScheme_Test.java
index b75a0dc..e80e65e 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/SecurityScheme_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/SecurityScheme_Test.java
@@ -134,22 +134,22 @@ public class SecurityScheme_Test {
 		SecurityScheme t = new SecurityScheme();
 
 		t.scopes(AMap.of("foo","bar"));
-		assertObject(t.scopes()).isType(Map.class).asJson().is("{foo:'bar'}");
+		assertOptional(t.scopes()).isType(Map.class).asJson().is("{foo:'bar'}");
 
 		t.scopes(AMap.create());
-		assertObject(t.scopes()).isType(Map.class).asJson().is("{}");
+		assertOptional(t.scopes()).isType(Map.class).asJson().is("{}");
 
 		t.scopes((Map<String,String>)null);
-		assertObject(t.scopes()).isNull();
+		assertOptional(t.scopes()).isNull();
 
 		t.addScopes(AMap.of("foo","bar"));
-		assertObject(t.scopes()).isType(Map.class).asJson().is("{foo:'bar'}");
+		assertOptional(t.scopes()).isType(Map.class).asJson().is("{foo:'bar'}");
 
 		t.addScopes(AMap.create());
-		assertObject(t.scopes()).isType(Map.class).asJson().is("{foo:'bar'}");
+		assertOptional(t.scopes()).isType(Map.class).asJson().is("{foo:'bar'}");
 
 		t.addScopes(null);
-		assertObject(t.scopes()).isType(Map.class).asJson().is("{foo:'bar'}");
+		assertOptional(t.scopes()).isType(Map.class).asJson().is("{foo:'bar'}");
 	}
 
 	/**
diff --git a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Swagger_Test.java b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Swagger_Test.java
index fbab3f5..6eda161 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Swagger_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Swagger_Test.java
@@ -52,13 +52,13 @@ public class Swagger_Test {
 		Swagger t = new Swagger();
 
 		t.info(info("foo", "bar"));
-		assertObject(t.info()).asJson().is("{title:'foo',version:'bar'}");
+		assertOptional(t.info()).asJson().is("{title:'foo',version:'bar'}");
 
 		t.info("{title:'foo',version:'bar'}");
-		assertObject(t.info()).isType(Info.class).asJson().is("{title:'foo',version:'bar'}");
+		assertOptional(t.info()).isType(Info.class).asJson().is("{title:'foo',version:'bar'}");
 
 		t.info((String)null);
-		assertObject(t.info()).isNull();
+		assertOptional(t.info()).isNull();
 	}
 
 	/**
@@ -97,22 +97,22 @@ public class Swagger_Test {
 		Swagger t = new Swagger();
 
 		t.schemes(ASet.of("foo","bar"));
-		assertObject(t.schemes()).isType(Set.class).asJson().is("['foo','bar']");
+		assertOptional(t.schemes()).isType(Set.class).asJson().is("['foo','bar']");
 
 		t.schemes(ASet.of());
-		assertObject(t.schemes()).isType(Set.class).asJson().is("[]");
+		assertOptional(t.schemes()).isType(Set.class).asJson().is("[]");
 
 		t.schemes((Collection<String>)null);
-		assertObject(t.schemes()).isNull();
+		assertOptional(t.schemes()).isNull();
 
 		t.addSchemes(ASet.of("foo","bar"));
-		assertObject(t.schemes()).isType(Set.class).asJson().is("['foo','bar']");
+		assertOptional(t.schemes()).isType(Set.class).asJson().is("['foo','bar']");
 
 		t.addSchemes(ASet.of());
-		assertObject(t.schemes()).isType(Set.class).asJson().is("['foo','bar']");
+		assertOptional(t.schemes()).isType(Set.class).asJson().is("['foo','bar']");
 
 		t.addSchemes(null);
-		assertObject(t.schemes()).isType(Set.class).asJson().is("['foo','bar']");
+		assertOptional(t.schemes()).isType(Set.class).asJson().is("['foo','bar']");
 	}
 
 	/**
@@ -123,22 +123,22 @@ public class Swagger_Test {
 		Swagger t = new Swagger();
 
 		t.consumes(ASet.of(MediaType.of("text/foo")));
-		assertObject(t.consumes()).isType(Set.class).asJson().is("['text/foo']");
+		assertOptional(t.consumes()).isType(Set.class).asJson().is("['text/foo']");
 
 		t.consumes(ASet.of());
-		assertObject(t.consumes()).isType(Set.class).asJson().is("[]");
+		assertOptional(t.consumes()).isType(Set.class).asJson().is("[]");
 
 		t.consumes((Collection<MediaType>)null);
-		assertObject(t.consumes()).isNull();
+		assertOptional(t.consumes()).isNull();
 
 		t.addConsumes(ASet.of(MediaType.of("text/foo")));
-		assertObject(t.consumes()).isType(Set.class).asJson().is("['text/foo']");
+		assertOptional(t.consumes()).isType(Set.class).asJson().is("['text/foo']");
 
 		t.addConsumes(ASet.of());
-		assertObject(t.consumes()).isType(Set.class).asJson().is("['text/foo']");
+		assertOptional(t.consumes()).isType(Set.class).asJson().is("['text/foo']");
 
 		t.addConsumes(null);
-		assertObject(t.consumes()).isType(Set.class).asJson().is("['text/foo']");
+		assertOptional(t.consumes()).isType(Set.class).asJson().is("['text/foo']");
 	}
 
 	/**
@@ -149,22 +149,22 @@ public class Swagger_Test {
 		Swagger t = new Swagger();
 
 		t.produces(ASet.of(MediaType.of("text/foo")));
-		assertObject(t.produces()).isType(Set.class).asJson().is("['text/foo']");
+		assertOptional(t.produces()).isType(Set.class).asJson().is("['text/foo']");
 
 		t.produces(ASet.of());
-		assertObject(t.produces()).isType(Set.class).asJson().is("[]");
+		assertOptional(t.produces()).isType(Set.class).asJson().is("[]");
 
 		t.produces((Collection<MediaType>)null);
-		assertObject(t.produces()).isNull();
+		assertOptional(t.produces()).isNull();
 
 		t.addProduces(ASet.of(MediaType.of("text/foo")));
-		assertObject(t.produces()).isType(Set.class).asJson().is("['text/foo']");
+		assertOptional(t.produces()).isType(Set.class).asJson().is("['text/foo']");
 
 		t.addProduces(ASet.of());
-		assertObject(t.produces()).isType(Set.class).asJson().is("['text/foo']");
+		assertOptional(t.produces()).isType(Set.class).asJson().is("['text/foo']");
 
 		t.addProduces(null);
-		assertObject(t.produces()).isType(Set.class).asJson().is("['text/foo']");
+		assertOptional(t.produces()).isType(Set.class).asJson().is("['text/foo']");
 	}
 
 	/**
@@ -175,28 +175,28 @@ public class Swagger_Test {
 		Swagger t = new Swagger();
 
 		t.paths(AMap.of("foo", new OperationMap().append("bar",operation().summary("baz"))));
-		assertObject(t.paths()).isType(Map.class).asJson().is("{foo:{bar:{summary:'baz'}}}");
+		assertOptional(t.paths()).isType(Map.class).asJson().is("{foo:{bar:{summary:'baz'}}}");
 
 		t.paths(AMap.create());
-		assertObject(t.paths()).isNull();
+		assertOptional(t.paths()).isNull();
 
 		t.paths((Map<String,OperationMap>)null);
-		assertObject(t.paths()).isNull();
+		assertOptional(t.paths()).isNull();
 
 		t.addPaths(AMap.of("foo",new OperationMap().append("bar",operation().summary("baz"))));
-		assertObject(t.paths()).isType(Map.class).asJson().is("{foo:{bar:{summary:'baz'}}}");
+		assertOptional(t.paths()).isType(Map.class).asJson().is("{foo:{bar:{summary:'baz'}}}");
 
 		t.addPaths(AMap.create());
-		assertObject(t.paths()).isType(Map.class).asJson().is("{foo:{bar:{summary:'baz'}}}");
+		assertOptional(t.paths()).isType(Map.class).asJson().is("{foo:{bar:{summary:'baz'}}}");
 
 		t.addPaths(null);
-		assertObject(t.paths()).isType(Map.class).asJson().is("{foo:{bar:{summary:'baz'}}}");
+		assertOptional(t.paths()).isType(Map.class).asJson().is("{foo:{bar:{summary:'baz'}}}");
 
 		t.setPaths(null);
 		t.path("a", "a1", operation().description("a2"));
 		t.path("b", null, null);
 
-		assertObject(t.paths()).asJson().is("{a:{a1:{description:'a2'}},b:{null:null}}");
+		assertOptional(t.paths()).asJson().is("{a:{a1:{description:'a2'}},b:{null:null}}");
 	}
 
 	/**
@@ -207,29 +207,29 @@ public class Swagger_Test {
 		Swagger t = new Swagger();
 
 		t.definitions(AMap.of("foo",OMap.of("type","bar")));
-		assertObject(t.definitions()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
+		assertOptional(t.definitions()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
 
 		t.definitions(AMap.create());
-		assertObject(t.definitions()).isType(Map.class).asJson().is("{}");
+		assertOptional(t.definitions()).isType(Map.class).asJson().is("{}");
 
 		t.definitions((Map<String,OMap>)null);
-		assertObject(t.definitions()).isNull();
+		assertOptional(t.definitions()).isNull();
 
 		t.addDefinitions(AMap.of("foo",OMap.of("type", "bar")));
-		assertObject(t.definitions()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
+		assertOptional(t.definitions()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
 
 		t.addDefinitions(AMap.create());
-		assertObject(t.definitions()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
+		assertOptional(t.definitions()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
 
 		t.addDefinitions(null);
-		assertObject(t.definitions()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
+		assertOptional(t.definitions()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
 
 		t.setDefinitions(null);
 		t.definition("a", OMap.of("type","a1"));
 		t.definition("b", (OMap)null);
 		t.definition(null, OMap.of("type", "c1"));
 
-		assertObject(t.definitions()).asJson().is("{a:{type:'a1'},b:null,null:{type:'c1'}}");
+		assertOptional(t.definitions()).asJson().is("{a:{type:'a1'},b:null,null:{type:'c1'}}");
 	}
 
 	/**
@@ -240,29 +240,29 @@ public class Swagger_Test {
 		Swagger t = new Swagger();
 
 		t.parameters(AMap.of("foo",parameterInfo().name("bar")));
-		assertObject(t.parameters()).isType(Map.class).asJson().is("{foo:{name:'bar'}}");
+		assertOptional(t.parameters()).isType(Map.class).asJson().is("{foo:{name:'bar'}}");
 
 		t.parameters(AMap.create());
-		assertObject(t.parameters()).isType(Map.class).asJson().is("{}");
+		assertOptional(t.parameters()).isType(Map.class).asJson().is("{}");
 
 		t.parameters((Map<String,ParameterInfo>)null);
-		assertObject(t.parameters()).isNull();
+		assertOptional(t.parameters()).isNull();
 
 		t.addParameters(AMap.of("foo",parameterInfo().name("bar")));
-		assertObject(t.parameters()).isType(Map.class).asJson().is("{foo:{name:'bar'}}");
+		assertOptional(t.parameters()).isType(Map.class).asJson().is("{foo:{name:'bar'}}");
 
 		t.addParameters(AMap.create());
-		assertObject(t.parameters()).isType(Map.class).asJson().is("{foo:{name:'bar'}}");
+		assertOptional(t.parameters()).isType(Map.class).asJson().is("{foo:{name:'bar'}}");
 
 		t.addParameters(null);
-		assertObject(t.parameters()).isType(Map.class).asJson().is("{foo:{name:'bar'}}");
+		assertOptional(t.parameters()).isType(Map.class).asJson().is("{foo:{name:'bar'}}");
 
 		t.setParameters(null);
 		t.parameter("a", parameterInfo().in("a1"));
 		t.parameter("b", null);
 		t.parameter(null, parameterInfo().in("c1"));
 
-		assertObject(t.parameters()).asJson().is("{a:{'in':'a1'},b:null,null:{'in':'c1'}}");
+		assertOptional(t.parameters()).asJson().is("{a:{'in':'a1'},b:null,null:{'in':'c1'}}");
 	}
 
 	/**
@@ -273,29 +273,29 @@ public class Swagger_Test {
 		Swagger t = new Swagger();
 
 		t.responses(AMap.of("123",responseInfo("bar")));
-		assertObject(t.responses()).isType(Map.class).asJson().is("{'123':{description:'bar'}}");
+		assertOptional(t.responses()).isType(Map.class).asJson().is("{'123':{description:'bar'}}");
 
 		t.responses(AMap.create());
-		assertObject(t.responses()).isType(Map.class).asJson().is("{}");
+		assertOptional(t.responses()).isType(Map.class).asJson().is("{}");
 
 		t.responses((Map<String,ResponseInfo>)null);
-		assertObject(t.responses()).isNull();
+		assertOptional(t.responses()).isNull();
 
 		t.addResponses(AMap.of("123",responseInfo("bar")));
-		assertObject(t.responses()).isType(Map.class).asJson().is("{'123':{description:'bar'}}");
+		assertOptional(t.responses()).isType(Map.class).asJson().is("{'123':{description:'bar'}}");
 
 		t.addResponses(AMap.create());
-		assertObject(t.responses()).isType(Map.class).asJson().is("{'123':{description:'bar'}}");
+		assertOptional(t.responses()).isType(Map.class).asJson().is("{'123':{description:'bar'}}");
 
 		t.addResponses(null);
-		assertObject(t.responses()).isType(Map.class).asJson().is("{'123':{description:'bar'}}");
+		assertOptional(t.responses()).isType(Map.class).asJson().is("{'123':{description:'bar'}}");
 
 		t.setResponses(null);
 		t.response("a", responseInfo("a1"));
 		t.response(null, responseInfo("b1"));
 		t.response("c", null);
 
-		assertObject(t.responses()).asJson().is("{a:{description:'a1'},null:{description:'b1'},c:null}");
+		assertOptional(t.responses()).asJson().is("{a:{description:'a1'},null:{description:'b1'},c:null}");
 	}
 
 	/**
@@ -306,29 +306,29 @@ public class Swagger_Test {
 		Swagger t = new Swagger();
 
 		t.securityDefinitions(AMap.of("foo",securityScheme("bar")));
-		assertObject(t.securityDefinitions()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
+		assertOptional(t.securityDefinitions()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
 
 		t.securityDefinitions(AMap.create());
-		assertObject(t.securityDefinitions()).isType(Map.class).asJson().is("{}");
+		assertOptional(t.securityDefinitions()).isType(Map.class).asJson().is("{}");
 
 		t.securityDefinitions((Map<String,SecurityScheme>)null);
-		assertObject(t.securityDefinitions()).isNull();
+		assertOptional(t.securityDefinitions()).isNull();
 
 		t.addSecurityDefinitions(AMap.of("foo",securityScheme("bar")));
-		assertObject(t.securityDefinitions()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
+		assertOptional(t.securityDefinitions()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
 
 		t.addSecurityDefinitions(AMap.create());
-		assertObject(t.securityDefinitions()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
+		assertOptional(t.securityDefinitions()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
 
 		t.addSecurityDefinitions(null);
-		assertObject(t.securityDefinitions()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
+		assertOptional(t.securityDefinitions()).isType(Map.class).asJson().is("{foo:{type:'bar'}}");
 
 		t.setSecurityDefinitions(null);
 		t.securityDefinition("a", securityScheme("a1"));
 		t.securityDefinition("b", null);
 		t.securityDefinition(null, securityScheme("c1"));
 
-		assertObject(t.securityDefinitions()).asJson().is("{a:{type:'a1'},b:null,null:{type:'c1'}}");
+		assertOptional(t.securityDefinitions()).asJson().is("{a:{type:'a1'},b:null,null:{type:'c1'}}");
 	}
 
 	/**
@@ -339,29 +339,29 @@ public class Swagger_Test {
 		Swagger t = new Swagger();
 
 		t.security(ASet.of(AMap.of("foo",AList.of("bar"))));
-		assertObject(t.security()).isType(List.class).asJson().is("[{foo:['bar']}]");
+		assertOptional(t.security()).isType(List.class).asJson().is("[{foo:['bar']}]");
 
 		t.security(ASet.of());
-		assertObject(t.security()).isType(List.class).asJson().is("[]");
+		assertOptional(t.security()).isType(List.class).asJson().is("[]");
 
 		t.security((Collection<Map<String, List<String>>>)null);
-		assertObject(t.security()).isNull();
+		assertOptional(t.security()).isNull();
 
 		t.addSecurity(ASet.of(AMap.of("foo",AList.of("bar"))));
-		assertObject(t.security()).isType(List.class).asJson().is("[{foo:['bar']}]");
+		assertOptional(t.security()).isType(List.class).asJson().is("[{foo:['bar']}]");
 
 		t.addSecurity(ASet.of());
-		assertObject(t.security()).isType(List.class).asJson().is("[{foo:['bar']}]");
+		assertOptional(t.security()).isType(List.class).asJson().is("[{foo:['bar']}]");
 
 		t.addSecurity(null);
-		assertObject(t.security()).isType(List.class).asJson().is("[{foo:['bar']}]");
+		assertOptional(t.security()).isType(List.class).asJson().is("[{foo:['bar']}]");
 
 		t.setSecurity(null);
 		t.security("a", "a1", "a2");
 		t.security("b", (String)null);
 		t.security(null, "d1", "d2");
 
-		assertObject(t.security()).asJson().is("[{a:['a1','a2']},{b:[null]},{null:['d1','d2']}]");
+		assertOptional(t.security()).asJson().is("[{a:['a1','a2']},{b:[null]},{null:['d1','d2']}]");
 	}
 
 	/**
@@ -372,22 +372,22 @@ public class Swagger_Test {
 		Swagger t = new Swagger();
 
 		t.tags(ASet.of(tag("foo")));
-		assertObject(t.tags()).isType(Set.class).asJson().is("[{name:'foo'}]");
+		assertOptional(t.tags()).isType(Set.class).asJson().is("[{name:'foo'}]");
 
 		t.tags(ASet.of());
-		assertObject(t.tags()).isType(Set.class).asJson().is("[]");
+		assertOptional(t.tags()).isType(Set.class).asJson().is("[]");
 
 		t.tags((Collection<Tag>)null);
-		assertObject(t.tags()).isNull();
+		assertOptional(t.tags()).isNull();
 
 		t.addTags(ASet.of(tag("foo")));
-		assertObject(t.tags()).isType(Set.class).asJson().is("[{name:'foo'}]");
+		assertOptional(t.tags()).isType(Set.class).asJson().is("[{name:'foo'}]");
 
 		t.addTags(ASet.of());
-		assertObject(t.tags()).isType(Set.class).asJson().is("[{name:'foo'}]");
+		assertOptional(t.tags()).isType(Set.class).asJson().is("[{name:'foo'}]");
 
 		t.addTags(null);
-		assertObject(t.tags()).isType(Set.class).asJson().is("[{name:'foo'}]");
+		assertOptional(t.tags()).isType(Set.class).asJson().is("[{name:'foo'}]");
 	}
 
 	/**
@@ -398,13 +398,13 @@ public class Swagger_Test {
 		Swagger t = new Swagger();
 
 		t.externalDocs(externalDocumentation("foo"));
-		assertObject(t.externalDocs()).asJson().is("{url:'foo'}");
+		assertOptional(t.externalDocs()).asJson().is("{url:'foo'}");
 
 		t.externalDocs("{url:'foo'}");
-		assertObject(t.externalDocs()).isType(ExternalDocumentation.class).asJson().is("{url:'foo'}");
+		assertOptional(t.externalDocs()).isType(ExternalDocumentation.class).asJson().is("{url:'foo'}");
 
 		t.externalDocs((String)null);
-		assertObject(t.externalDocs()).isNull();
+		assertOptional(t.externalDocs()).isNull();
 	}
 
 	/**
diff --git a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Tag_Test.java b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Tag_Test.java
index ae177ed..2172879 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Tag_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Tag_Test.java
@@ -62,13 +62,13 @@ public class Tag_Test {
 		Tag t = new Tag();
 
 		t.externalDocs(externalDocumentation("foo"));
-		assertObject(t.externalDocs()).asJson().is("{url:'foo'}");
+		assertOptional(t.externalDocs()).asJson().is("{url:'foo'}");
 
 		t.externalDocs("{url:'foo'}");
-		assertObject(t.externalDocs()).isType(ExternalDocumentation.class).asJson().is("{url:'foo'}");;
+		assertOptional(t.externalDocs()).isType(ExternalDocumentation.class).asJson().is("{url:'foo'}");;
 
 		t.externalDocs((String)null);
-		assertObject(t.externalDocs()).isNull();
+		assertOptional(t.externalDocs()).isNull();
 	}
 
 	/**
diff --git a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Xml_Test.java b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Xml_Test.java
index 84bf0d2..b649c2f 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Xml_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/dto/swagger/Xml_Test.java
@@ -75,13 +75,13 @@ public class Xml_Test {
 		Xml t = new Xml();
 
 		t.attribute(true);
-		assertObject(t.attribute()).isType(Boolean.class).is(true);
+		assertOptional(t.attribute()).isType(Boolean.class).is(true);
 
 		t.attribute("true");
-		assertObject(t.attribute()).isType(Boolean.class).is(true);
+		assertOptional(t.attribute()).isType(Boolean.class).is(true);
 
 		t.attribute((String)null);
-		assertObject(t.attribute()).isNull();
+		assertOptional(t.attribute()).isNull();
 	}
 
 	/**
@@ -92,13 +92,13 @@ public class Xml_Test {
 		Xml t = new Xml();
 
 		t.wrapped(true);
-		assertObject(t.wrapped()).isType(Boolean.class).is(true);
+		assertOptional(t.wrapped()).isType(Boolean.class).is(true);
 
 		t.wrapped("true");
-		assertObject(t.wrapped()).isType(Boolean.class).is(true);
+		assertOptional(t.wrapped()).isType(Boolean.class).is(true);
 
 		t.wrapped((String)null);
-		assertObject(t.wrapped()).isNull();
+		assertOptional(t.wrapped()).isNull();
 	}
 
 	/**
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/BasicHttpResource_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/BasicHttpResource_Test.java
index 376bd66..6f741c7 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/BasicHttpResource_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/BasicHttpResource_Test.java
@@ -119,8 +119,8 @@ public class BasicHttpResource_Test {
 		HeaderList x = stringResource("foo").header("Foo","bar").header("Foo","baz").header(null,"bar").header("foo",null).build().getHeaders();
 		assertString(x.getFirst("Foo").get().toString()).is("Foo: bar");
 		assertString(x.getLast("Foo").get().toString()).is("Foo: baz");
-		assertObject(x.getFirst("Bar")).doesNotExist();
-		assertObject(x.getLast("Bar")).doesNotExist();
+		assertOptional(x.getFirst("Bar")).doesNotExist();
+		assertOptional(x.getLast("Bar")).doesNotExist();
 		assertObject(x.getAll()).asJson().is("['Foo: bar','Foo: baz']");
 	}
 
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicDateHeader_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicDateHeader_Test.java
index 246e461..7465170 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicDateHeader_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/BasicDateHeader_Test.java
@@ -71,7 +71,7 @@ public class BasicDateHeader_Test {
 
 	@Test
 	public void a02_asZonedDateTime() throws Exception {
-		assertObject(dateHeader(HEADER,VALUE).asZonedDateTime()).asString().is("1994-10-29T19:43:31Z");
+		assertOptional(dateHeader(HEADER,VALUE).asZonedDateTime()).asString().is("1994-10-29T19:43:31Z");
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/header/HeaderList_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/header/HeaderList_Test.java
index ef1ad84..5a5ee8d 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/HeaderList_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/HeaderList_Test.java
@@ -149,12 +149,12 @@ public class HeaderList_Test {
 	@Test
 	public void a06_getCondensed() {
 		HeaderList x = HeaderList.of(FOO_1);
-		assertObject(x.get((String)null)).isNull();
-		assertObject(x.get("Foo")).isString("Foo: 1");
-		assertObject(x.get("Bar")).isNull();
+		assertOptional(x.get((String)null)).isNull();
+		assertOptional(x.get("Foo")).isString("Foo: 1");
+		assertOptional(x.get("Bar")).isNull();
 		x = HeaderList.of(FOO_1, FOO_2, FOO_3, X_x);
-		assertObject(x.get("Foo")).isString("Foo: 1, 2, 3");
-		assertObject(x.get("Bar")).isNull();
+		assertOptional(x.get("Foo")).isString("Foo: 1, 2, 3");
+		assertOptional(x.get("Bar")).isNull();
 	}
 
 	@org.apache.juneau.http.annotation.Header("Foo")
@@ -169,13 +169,13 @@ public class HeaderList_Test {
 	@Test
 	public void a07_getCondensed_asType() {
 		HeaderList x = HeaderList.of(FOO_1);
-		assertObject(x.get(null, Allow.class)).isNull();
-		assertObject(x.get("Foo", Allow.class)).isString("Allow: 1");
-		assertObject(x.get("Bar", Allow.class)).isNull();
+		assertOptional(x.get(null, Allow.class)).isNull();
+		assertOptional(x.get("Foo", Allow.class)).isString("Allow: 1");
+		assertOptional(x.get("Bar", Allow.class)).isNull();
 		x = HeaderList.of(FOO_1, FOO_2, FOO_3, X_x);
-		assertObject(x.get("Foo", Allow.class)).isString("Allow: 1, 2, 3");
-		assertObject(x.get("Bar", Allow.class)).isNull();
-		assertObject(x.get(Foo.class)).isString("Foo: 1, 2, 3");
+		assertOptional(x.get("Foo", Allow.class)).isString("Allow: 1, 2, 3");
+		assertOptional(x.get("Bar", Allow.class)).isNull();
+		assertOptional(x.get(Foo.class)).isString("Foo: 1, 2, 3");
 		final HeaderList x2 = x;
 		assertThrown(()->x2.get(String.class)).message().is("Header name could not be found on bean type 'java.lang.String'");
 	}
@@ -192,19 +192,19 @@ public class HeaderList_Test {
 	@Test
 	public void a09_getFirst() {
 		HeaderList x = HeaderList.of(FOO_1, FOO_2, X_x);
-		assertObject(x.getFirst(null)).isNull();
-		assertObject(x.getFirst("Foo")).isString("Foo: 1");
-		assertObject(x.getFirst("FOO")).isString("Foo: 1");
-		assertObject(x.getFirst("Bar")).isNull();
+		assertOptional(x.getFirst(null)).isNull();
+		assertOptional(x.getFirst("Foo")).isString("Foo: 1");
+		assertOptional(x.getFirst("FOO")).isString("Foo: 1");
+		assertOptional(x.getFirst("Bar")).isNull();
 	}
 
 	@Test
 	public void a10_getLast() {
 		HeaderList x = HeaderList.of(FOO_1, FOO_2, X_x);
-		assertObject(x.getLast(null)).isNull();
-		assertObject(x.getLast("Foo")).isString("Foo: 2");
-		assertObject(x.getLast("FOO")).isString("Foo: 2");
-		assertObject(x.getLast("Bar")).isNull();
+		assertOptional(x.getLast(null)).isNull();
+		assertOptional(x.getLast("Foo")).isString("Foo: 2");
+		assertOptional(x.getLast("FOO")).isString("Foo: 2");
+		assertOptional(x.getLast("Bar")).isNull();
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/header/IfRange_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/header/IfRange_Test.java
index 4987637..c69224e 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/IfRange_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/IfRange_Test.java
@@ -82,8 +82,8 @@ public class IfRange_Test {
 	public void a02_asEntityTag() throws Exception {
 		EntityTag x = ifRange(VALUE1).asEntityTag().get();
 		assertString(x).is("\"foo\"");
-		assertObject(ifRange(()->null).asEntityTag()).isNull();
-		assertObject(ifRange(()->PARSED3).asEntityTag()).isNull();
+		assertOptional(ifRange(()->null).asEntityTag()).isNull();
+		assertOptional(ifRange(()->PARSED3).asEntityTag()).isNull();
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/header/RetryAfter_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/header/RetryAfter_Test.java
index 53df8f2..18e4cb3 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/header/RetryAfter_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/header/RetryAfter_Test.java
@@ -79,9 +79,9 @@ public class RetryAfter_Test {
 
 	@Test
 	public void a03_asInt() throws Exception {
-		assertObject(retryAfter(123).asInteger()).is(123);
-		assertObject(new RetryAfter((String)null).asInteger()).isNull();
-		assertObject(retryAfter(()->null).asInteger()).isNull();
+		assertOptional(retryAfter(123).asInteger()).is(123);
+		assertOptional(new RetryAfter((String)null).asInteger()).isNull();
+		assertOptional(retryAfter(()->null).asInteger()).isNull();
 	}
 
 	//------------------------------------------------------------------------------------------------------------------
diff --git a/juneau-utest/src/test/java/org/apache/juneau/http/part/PartList_Test.java b/juneau-utest/src/test/java/org/apache/juneau/http/part/PartList_Test.java
index 46e3a80..bd14da0 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/http/part/PartList_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/http/part/PartList_Test.java
@@ -174,12 +174,12 @@ public class PartList_Test {
 	@Test
 	public void a06_getCondensed() {
 		PartList x = PartList.of(FOO_1);
-		assertObject(x.get((String)null)).isNull();
-		assertObject(x.get("Foo")).isString("Foo=1");
-		assertObject(x.get("Bar")).isNull();
+		assertOptional(x.get((String)null)).isNull();
+		assertOptional(x.get("Foo")).isString("Foo=1");
+		assertOptional(x.get("Bar")).isNull();
 		x = PartList.of(FOO_1, FOO_2, FOO_3, X_x);
-		assertObject(x.get("Foo")).isString("Foo=1,2,3");
-		assertObject(x.get("Bar")).isNull();
+		assertOptional(x.get("Foo")).isString("Foo=1,2,3");
+		assertOptional(x.get("Bar")).isNull();
 	}
 
 	@Query("Foo")
@@ -192,13 +192,13 @@ public class PartList_Test {
 	@Test
 	public void a07_getCondensed_asType() {
 		PartList x = PartList.of(FOO_1);
-		assertObject(x.get(null, APart.class)).isNull();
-		assertObject(x.get("Foo", APart.class)).isString("a=1");
-		assertObject(x.get("Bar", APart.class)).isNull();
+		assertOptional(x.get(null, APart.class)).isNull();
+		assertOptional(x.get("Foo", APart.class)).isString("a=1");
+		assertOptional(x.get("Bar", APart.class)).isNull();
 		x = PartList.of(FOO_1, FOO_2, FOO_3, X_x);
-		assertObject(x.get("Foo", APart.class)).isString("a=1,2,3");
-		assertObject(x.get("Bar", APart.class)).isNull();
-		assertObject(x.get(Foo.class)).isString("Foo=1,2,3");
+		assertOptional(x.get("Foo", APart.class)).isString("a=1,2,3");
+		assertOptional(x.get("Bar", APart.class)).isNull();
+		assertOptional(x.get(Foo.class)).isString("Foo=1,2,3");
 		final PartList x2 = x;
 		assertThrown(()->x2.get(String.class)).message().is("Part name could not be found on bean type 'java.lang.String'");
 	}
@@ -215,19 +215,19 @@ public class PartList_Test {
 	@Test
 	public void a09_getFirst() {
 		PartList x = PartList.of(FOO_1, FOO_2, X_x);
-		assertObject(x.getFirst(null)).isNull();
-		assertObject(x.getFirst("Foo")).isString("Foo=1");
-		assertObject(x.getFirst("FOO")).isNull();
-		assertObject(x.getFirst("Bar")).isNull();
+		assertOptional(x.getFirst(null)).isNull();
+		assertOptional(x.getFirst("Foo")).isString("Foo=1");
+		assertOptional(x.getFirst("FOO")).isNull();
+		assertOptional(x.getFirst("Bar")).isNull();
 	}
 
 	@Test
 	public void a10_getLast() {
 		PartList x = PartList.of(FOO_1, FOO_2, X_x);
-		assertObject(x.getLast(null)).isNull();
-		assertObject(x.getLast("Foo")).isString("Foo=2");
-		assertObject(x.getLast("FOO")).isNull();
-		assertObject(x.getLast("Bar")).isNull();
+		assertOptional(x.getLast(null)).isNull();
+		assertOptional(x.getLast("Foo")).isString("Foo=2");
+		assertOptional(x.getLast("FOO")).isNull();
+		assertOptional(x.getLast("Bar")).isNull();
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/mstat/ThrownStore_Test.java b/juneau-utest/src/test/java/org/apache/juneau/mstat/ThrownStore_Test.java
index 558fb08..7beb877 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/mstat/ThrownStore_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/mstat/ThrownStore_Test.java
@@ -77,7 +77,7 @@ public class ThrownStore_Test {
 		db.add(t1);
 		db.reset();
 
-		assertObject(db.getStats(t1)).isNull();
+		assertOptional(db.getStats(t1)).isNull();
 	}
 
 	@Test
diff --git a/juneau-utest/src/test/java/org/apache/juneau/reflection/AnnotationInfoTest.java b/juneau-utest/src/test/java/org/apache/juneau/reflection/AnnotationInfoTest.java
index 6df3c15..06ec65d 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/reflection/AnnotationInfoTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/reflection/AnnotationInfoTest.java
@@ -96,8 +96,8 @@ public class AnnotationInfoTest {
 		ClassInfo c1 = ClassInfo.of(C1.class);
 		AnnotationInfo<?> ai = c1.getAnnotationInfos(C.class).get(0);
 		assertString(ai.getValue(String.class, "foo")).is("bar");
-		assertObject(ai.getValue(Integer.class, "foo")).isNull();
-		assertObject(ai.getValue(String.class, "bar")).isNull();
+		assertOptional(ai.getValue(Integer.class, "foo")).isNull();
+		assertOptional(ai.getValue(String.class, "bar")).isNull();
 	}
 
 
diff --git a/juneau-utest/src/test/java/org/apache/juneau/utils/ReflectionMapTest.java b/juneau-utest/src/test/java/org/apache/juneau/utils/ReflectionMapTest.java
index 0d40b74..04e82ae 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/utils/ReflectionMapTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/utils/ReflectionMapTest.java
@@ -353,7 +353,7 @@ public class ReflectionMapTest {
 
 	@Test
 	public void f01_cdl() {
-		assertObject(RM_F.find(F1.class, null)).asJson().is("1");
+		assertOptional(RM_F.find(F1.class, null)).asJson().is("1");
 	}
 
 	//------------------------------------------------------------------------------------------------------------------