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 12f4609da Unit test modernization.
     new c568c8fab Merge branch 'master' of 
https://gitbox.apache.org/repos/asf/juneau.git
12f4609da is described below

commit 12f4609daa192b042bea7811231aefaebb70ef11
Author: James Bognar <[email protected]>
AuthorDate: Tue Aug 5 09:15:13 2025 -0400

    Unit test modernization.
---
 .../apache/juneau/common/internal/AsciiSet.java    |   2 +-
 .../apache/juneau/common/internal/StringUtils.java | 182 +++++-
 .../org/apache/juneau/common/internal/Utils.java   |  75 ++-
 .../juneau/config/internal/ConfigMapEntry.java     |   2 +-
 .../java/org/apache/juneau/json/JsonWriter.java    |   4 +-
 .../juneau/oapi/OpenApiSerializerSession.java      |  10 +-
 .../juneau/objecttools/NumberMatcherFactory.java   |   6 +-
 .../juneau/objecttools/StringMatcherFactory.java   |   8 +-
 .../juneau/objecttools/TimeMatcherFactory.java     |   4 +-
 .../org/apache/juneau/svl/VarResolverSession.java  |   4 +-
 .../org/apache/juneau/uon/UonParserSession.java    |   4 +-
 .../main/java/org/apache/juneau/uon/UonUtils.java  |   4 +-
 .../main/java/org/apache/juneau/uon/UonWriter.java |   4 +-
 .../juneau/utils/StringExpressionMatcher.java      |   6 +-
 .../org/apache/juneau/rest/guard/RoleMatcher.java  |   6 +-
 ...{AnnotationsTest.java => Annotations_Test.java} |  45 +-
 .../{BasicBeanTests.java => BasicBeans_Test.java}  |  45 +-
 .../{BeanConfigTest.java => BeanConfig_Test.java}  | 612 ++++++++-------------
 .../java/org/apache/juneau/SimpleTestBase.java     | 260 ++++-----
 .../a/rttests/RoundTripBeanPropertiesTest.java     |   4 -
 .../org/apache/juneau/reflect/ClassInfoTest.java   |   2 +-
 .../utils/{CharSetTest.java => AsciiSet_Test.java} |  15 +-
 .../org/apache/juneau/utils/StringUtilsTest.java   | 527 +++++++-----------
 23 files changed, 872 insertions(+), 959 deletions(-)

diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/AsciiSet.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/AsciiSet.java
index 8a8618443..97a4b546f 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/AsciiSet.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/AsciiSet.java
@@ -29,7 +29,7 @@ public final class AsciiSet {
         * @param chars The characters to keep in this store.
         * @return A new object.
         */
-       public static AsciiSet create(String chars) {
+       public static AsciiSet of(String chars) {
                return new Builder().chars(chars).build();
        }
 
diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/StringUtils.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/StringUtils.java
index 94297bda1..10d8f1075 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/StringUtils.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/StringUtils.java
@@ -17,6 +17,7 @@ import static org.apache.juneau.common.internal.IOUtils.*;
 import static org.apache.juneau.common.internal.ThrowableUtils.*;
 import static java.nio.charset.StandardCharsets.*;
 import static java.lang.Character.*;
+import static org.apache.juneau.common.internal.Utils.*;
 
 import java.io.*;
 import java.lang.reflect.*;
@@ -49,11 +50,11 @@ public final class StringUtils {
         */
        public static final Predicate<String> NOT_EMPTY = 
StringUtils::isNotEmpty;
 
-       private static final AsciiSet numberChars = 
AsciiSet.create("-xX.+-#pP0123456789abcdefABCDEF");
-       private static final AsciiSet firstNumberChars 
=AsciiSet.create("+-.#0123456789");
-       private static final AsciiSet octChars = AsciiSet.create("01234567");
-       private static final AsciiSet decChars = AsciiSet.create("0123456789");
-       private static final AsciiSet hexChars = 
AsciiSet.create("0123456789abcdefABCDEF");
+       private static final AsciiSet numberChars = 
AsciiSet.of("-xX.+-#pP0123456789abcdefABCDEF");
+       private static final AsciiSet firstNumberChars 
=AsciiSet.of("+-.#0123456789");
+       private static final AsciiSet octChars = AsciiSet.of("01234567");
+       private static final AsciiSet decChars = AsciiSet.of("0123456789");
+       private static final AsciiSet hexChars = 
AsciiSet.of("0123456789abcdefABCDEF");
 
        // Maps 6-bit nibbles to BASE64 characters.
        private static final char[] base64m1 = 
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
@@ -512,6 +513,16 @@ public final class StringUtils {
                return split(s, ',');
        }
 
+       /**
+        * Shortcut for calling <code>split(s, <js>','</js>)</code>
+        *
+        * @param s The string to split.  Can be <jk>null</jk>.
+        * @return The tokens, or <jk>null</jk> if the string was null.
+        */
+       public static List<String> split2(String s) {
+               return split2(s, ',');
+       }
+
        /**
         * Same as {@link #split(String)} but consumes the tokens instead of 
creating an array.
         *
@@ -549,6 +560,33 @@ public final class StringUtils {
                return split(s, c, Integer.MAX_VALUE);
        }
 
+       /**
+        * Splits a character-delimited string into a string array.
+        *
+        * <p>
+        * Does not split on escaped-delimiters (e.g. "\,");
+        * Resulting tokens are trimmed of whitespace.
+        *
+        * <p>
+        * <b>NOTE:</b>  This behavior is different than the Jakarta equivalent.
+        * split("a,b,c",',') -&gt; {"a","b","c"}
+        * split("a, b ,c ",',') -&gt; {"a","b","c"}
+        * split("a,,c",',') -&gt; {"a","","c"}
+        * split(",,",',') -&gt; {"","",""}
+        * split("",',') -&gt; {}
+        * split(null,',') -&gt; null
+        * split("a,b\,c,d", ',', false) -&gt; {"a","b\,c","d"}
+        * split("a,b\\,c,d", ',', false) -&gt; {"a","b\","c","d"}
+        * split("a,b\,c,d", ',', true) -&gt; {"a","b,c","d"}
+        *
+        * @param s The string to split.  Can be <jk>null</jk>.
+        * @param c The character to split on.
+        * @return The tokens, or <jk>null</jk> if the string was null.
+        */
+       public static List<String> split2(String s, char c) {
+               return split2(s, c, Integer.MAX_VALUE);
+       }
+
        /**
         * Same as {@link #split(String,char)} but consumes the tokens instead 
of creating an array.
         *
@@ -595,15 +633,28 @@ public final class StringUtils {
         * @return The tokens, or <jk>null</jk> if the string was null.
         */
        public static String[] split(String s, char c, int limit) {
+               var l = split2(s, c, limit);
+               return l == null ? null : l.toArray(new String[l.size()]);
+       }
+
+       /**
+        * Same as {@link #split(String, char)} but limits the number of tokens 
returned.
+        *
+        * @param s The string to split.  Can be <jk>null</jk>.
+        * @param c The character to split on.
+        * @param limit The maximum number of tokens to return.
+        * @return The tokens, or <jk>null</jk> if the string was null.
+        */
+       public static List<String> split2(String s, char c, int limit) {
 
                var escapeChars = getEscapeSet(c);
 
                if (s == null)
                        return null;  // NOSONAR - Intentional.
                if (isEmpty(s))
-                       return new String[0];
+                       return Collections.emptyList();
                if (s.indexOf(c) == -1)
-                       return new String[]{s};
+                       return Collections.singletonList(s);
 
                var l = new LinkedList<String>();
                var sArray = s.toCharArray();
@@ -627,7 +678,7 @@ public final class StringUtils {
                var s3 = unEscapeChars(s2, escapeChars);
                l.add(s3.trim());
 
-               return l.toArray(new String[l.size()]);
+               return l;
        }
 
        /**
@@ -725,7 +776,7 @@ public final class StringUtils {
                return m;
        }
 
-       private static final AsciiSet MAP_ESCAPE_SET = AsciiSet.create(",=\\");
+       private static final AsciiSet MAP_ESCAPE_SET = AsciiSet.of(",=\\");
 
        /**
         * Returns <jk>true</jk> if the specified string contains any of the 
specified characters.
@@ -771,6 +822,117 @@ public final class StringUtils {
                return splitQuoted(s, false);
        }
 
+       /**
+        * Splits a comma-delimited list containing "nesting constructs".
+        *
+        * Nesting constructs are simple embedded "{...}" comma-delimted lists.
+        *
+        * Example:
+        *      "a{b,c},d" -> ["a{b,c}","d"]
+        *
+        * Handles escapes and trims whitespace from tokens.
+        *
+        * @param s The input string.
+        *      The results, or <jk>null</jk> if the input was <jk>null</jk>.
+        *      <br>An empty string results in an empty array.
+        */
+       public static List<String> splitNested(String s) {
+               var escapeChars = getEscapeSet(',');
+
+               if (s == null) return null;  // NOSONAR - Intentional.
+               if (isEmpty(s)) return Collections.emptyList();
+               if (s.indexOf(',') == -1) return 
Collections.singletonList(trim(s));
+
+               var l = new LinkedList<String>();
+
+               var x1 = 0;
+               var inEscape = false;
+               var depthCount = 0;
+
+               for (var i = 0; i < s.length(); i++) {
+                       var c = s.charAt(i);
+                       if (inEscape) {
+                               if (c == '\\') {
+                                       inEscape = false;
+                               }
+                       } else {
+                               if (c == '\\') {
+                                       inEscape = true;
+                               } else if (c == '{') {
+                                       depthCount++;
+                               } else if (c == '}') {
+                                       depthCount--;
+                               } else if (c == ',' && depthCount == 0) {
+                                       
l.add(trim(unEscapeChars(s.substring(x1, i), escapeChars)));
+                                       x1 = i+1;
+                               }
+                       }
+               }
+               l.add(trim(unEscapeChars(s.substring(x1, s.length()), 
escapeChars)));
+
+               return l;
+       }
+
+       /**
+        * Splits a nested comma-delimited list.
+        *
+        * Nesting constructs are simple embedded "{...}" comma-delimted lists.
+        *
+        * Example:
+        *      "a{b,c{d,e}}" -> ["b","c{d,e}"]
+        *
+        * Handles escapes and trims whitespace from tokens.
+        *
+        * @param s The input string.
+        *      The results, or <jk>null</jk> if the input was <jk>null</jk>.
+        *      <br>An empty string results in an empty array.
+        */
+       public static List<String> splitNestedInner(String s) {
+               if (s == null) throw illegalArg("String was null.");
+               if (isEmpty(s)) throw illegalArg("String was empty.");
+
+               final int
+                       S1 = 1,  // Looking for '{'
+                       S2 = 2;  // Found '{', looking for '}'
+
+               var start = -1;
+               var end = -1;
+               var state = S1;
+               var depth = 0;
+               var inEscape = false;
+
+               for (var i = 0; i < s.length(); i++) {
+                       var c = s.charAt(i);
+                       if (inEscape) {
+                               if (c == '\\') {
+                                       inEscape = false;
+                               }
+                       } else {
+                               if (c == '\\') {
+                                       inEscape = true;
+                               } else if (state == S1) {
+                                       if (c == '{') {
+                                               start = i+1;
+                                               state = S2;
+                                       }
+                               } else /* state == S2 */ {
+                                       if (c == '{') {
+                                               depth++;
+                                       } else if (depth > 0 && c == '}') {
+                                               depth--;
+                                       } else if (c == '}') {
+                                               end = i;
+                                               break;
+                                       }
+                               }
+                       }
+               }
+
+               if (start == -1) throw illegalArg("Start character '{' not 
found in string.", s);
+               if (end == -1) throw illegalArg("End character '}' not found in 
string.", s);
+               return splitNested(s.substring(start, end));
+       }
+
        /**
         * Same as {@link #splitQuoted(String)} but allows you to optionally 
keep the quote characters.
         *
@@ -850,7 +1012,7 @@ public final class StringUtils {
                return l.toArray(new String[l.size()]);
        }
 
-       private static final AsciiSet QUOTE_ESCAPE_SET = 
AsciiSet.create("\"'\\");
+       private static final AsciiSet QUOTE_ESCAPE_SET = AsciiSet.of("\"'\\");
 
        /**
         * Returns <jk>true</jk> if specified string is <jk>null</jk> or empty.
diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/Utils.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/Utils.java
index df57c6237..aaee109d1 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/Utils.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/internal/Utils.java
@@ -559,17 +559,10 @@ public class Utils {
                return result;
        }
 
-       private static final AsciiSet QUOTE_ESCAPE_SET = 
AsciiSet.create("\"'\\");
-       private static final AsciiSet COMMA_ESCAPE_SET = AsciiSet.create(",");
+       private static final AsciiSet QUOTE_ESCAPE_SET = AsciiSet.of("\"'\\");
+       private static final AsciiSet COMMA_ESCAPE_SET = AsciiSet.of(",");
 
 
-       /**
-        * Creates a supplier for a runtime exception.
-        */
-       public static Supplier<RuntimeException> runtimeException(String msg, 
Object...args) {
-               return () -> new RuntimeException(MessageFormat.format(msg, 
args));
-       }
-
        /**
         * Takes a supplier of anything and turns it into a Supplier<String>.
         * Useful when passing arguments to the logger.
@@ -655,7 +648,42 @@ public class Utils {
                return val == null ? null : val.toString();
        }
 
-       private static final AsciiSet ESCAPE_SET = AsciiSet.create(",=");
+       private static final AsciiSet ESCAPE_SET = AsciiSet.of(",=");
+
+       /**
+        * Shortcut for converting an object to a string.
+        */
+       public static String readable(Object o) {
+               if (o instanceof Collection)
+                       return (String) 
Collection.class.cast(o).stream().map(Utils::readable).collect(joining(",","[","]"));
+               if (o instanceof Map)
+                       return (String) 
Map.class.cast(o).entrySet().stream().map(Utils::readable).collect(joining(",","{","}"));
+               if (o instanceof Map.Entry) {
+                       var e = Map.Entry.class.cast(o);
+                       return readable(e.getKey()) + '=' + 
readable(e.getValue());
+               }
+               if (o instanceof GregorianCalendar) {
+                       return 
GregorianCalendar.class.cast(o).toZonedDateTime().format(DateTimeFormatter.ISO_INSTANT);
+               }
+               if (o instanceof Date) {
+                       return Date.class.cast(o).toInstant().toString();
+               }
+               if (o != null && o.getClass().isArray()) {
+                       List<Object> l = list();
+                       for (var i = 0; i < Array.getLength(o); i++) {
+                               l.add(Array.get(o, i));
+                       }
+                       return readable(l);
+               }
+               return StringUtils.stringify(o);
+       }
+
+       /**
+        * Shortcut for {@link #readable(Object)}
+        */
+       public static String r(Object o) {
+               return readable(o);
+       }
 
        /**
         * Prepends '\' to the beginning of ',' and '='.
@@ -752,8 +780,8 @@ public class Utils {
         * @return The same content that would normally be rendered via 
<c>t.printStackTrace()</c>
         */
        public static String getStackTrace(Throwable t) {
-               StringWriter sw = new StringWriter();
-               try (PrintWriter pw = new PrintWriter(sw)) {
+               var sw = new StringWriter();
+               try (var pw = new PrintWriter(sw)) {
                        t.printStackTrace(pw);
                }
                return sw.toString();
@@ -765,6 +793,27 @@ public class Utils {
        public static String obfuscate(String s) {
                if (s == null || s.length() < 2)
                        return "*";
-               return s.substring(0, 1) + s.substring(1).replaceAll(".", "*");
+               return s.substring(0, 1) + s.substring(1).replaceAll(".", "*"); 
 // NOSONAR
+       }
+
+       /**
+        * Returns a stream of strings from a comma-delimited string.
+        */
+       public static List<String> cdl(String value) {
+               return Arrays.asList(StringUtils.split(value));
+       }
+
+       /**
+        * Creates an {@link IllegalArgumentException}.
+        */
+       public static IllegalArgumentException illegalArg(String msg, 
Object...args) {
+               return new IllegalArgumentException(args.length == 0 ? msg : 
format(msg, args));
+       }
+
+       /**
+        * Creates a {@link RuntimeException}.
+        */
+       public static RuntimeException runtimeException(String msg, 
Object...args) {
+               return new RuntimeException(args.length == 0 ? msg : 
format(msg, args));
        }
 }
\ No newline at end of file
diff --git 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/internal/ConfigMapEntry.java
 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/internal/ConfigMapEntry.java
index b4a9679e8..b2db96c87 100644
--- 
a/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/internal/ConfigMapEntry.java
+++ 
b/juneau-core/juneau-config/src/main/java/org/apache/juneau/config/internal/ConfigMapEntry.java
@@ -160,5 +160,5 @@ public class ConfigMapEntry {
                return w;
        }
 
-       private static final AsciiSet REPLACE_CHARS = AsciiSet.create("\\#");
+       private static final AsciiSet REPLACE_CHARS = AsciiSet.of("\\#");
 }
\ No newline at end of file
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonWriter.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonWriter.java
index f1b20bc44..d43761632 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonWriter.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonWriter.java
@@ -37,8 +37,8 @@ public final class JsonWriter extends SerializerWriter {
 
        // Characters that trigger special handling of serializing attribute 
values.
        private static final AsciiSet
-               encodedChars = AsciiSet.create("\n\t\b\f\r'\"\\"),
-               encodedChars2 = AsciiSet.create("\n\t\b\f\r'\"\\/");
+               encodedChars = AsciiSet.of("\n\t\b\f\r'\"\\"),
+               encodedChars2 = AsciiSet.of("\n\t\b\f\r'\"\\/");
 
        private static final KeywordSet reservedWords = new KeywordSet(
                
"arguments","break","case","catch","class","const","continue","debugger","default","delete",
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerSession.java
index de668eb31..9f90ea4cd 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiSerializerSession.java
@@ -431,11 +431,11 @@ public class OpenApiSerializerSession extends 
UonSerializerSession {
        }
 
        private static class OapiStringBuilder {
-               static final AsciiSet EQ = AsciiSet.create("=\\");
-               static final AsciiSet PIPE = AsciiSet.create("|\\");
-               static final AsciiSet PIPE_OR_EQ = AsciiSet.create("|=\\");
-               static final AsciiSet COMMA = AsciiSet.create(",\\");
-               static final AsciiSet COMMA_OR_EQ = AsciiSet.create(",=\\");
+               static final AsciiSet EQ = AsciiSet.of("=\\");
+               static final AsciiSet PIPE = AsciiSet.of("|\\");
+               static final AsciiSet PIPE_OR_EQ = AsciiSet.of("|=\\");
+               static final AsciiSet COMMA = AsciiSet.of(",\\");
+               static final AsciiSet COMMA_OR_EQ = AsciiSet.of(",=\\");
 
                private final StringBuilder sb = new StringBuilder();
                private final HttpPartCollectionFormat cf;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/NumberMatcherFactory.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/NumberMatcherFactory.java
index 58fb9006e..c0ff14d5f 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/NumberMatcherFactory.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/NumberMatcherFactory.java
@@ -64,9 +64,9 @@ public class NumberMatcherFactory extends MatcherFactory {
                NumberRange[] numberRanges;
                String pattern;
                private static final AsciiSet
-                       SNUM = AsciiSet.create("-0123456789."),
-                       NUM = AsciiSet.create("0123456789."),
-                       WS = AsciiSet.create(" \t");
+                       SNUM = AsciiSet.of("-0123456789."),
+                       NUM = AsciiSet.of("0123456789."),
+                       WS = AsciiSet.of(" \t");
 
                public NumberMatcher(String s) {
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/StringMatcherFactory.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/StringMatcherFactory.java
index 6eb28726e..1e24be5fb 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/StringMatcherFactory.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/StringMatcherFactory.java
@@ -64,10 +64,10 @@ public class StringMatcherFactory extends MatcherFactory {
        private static class StringMatcher extends AbstractMatcher {
                private String pattern;
                private static final AsciiSet
-                       META_CHARS = AsciiSet.create("*?'\""),
-                       SQ_CHAR = AsciiSet.create("'"),
-                       DQ_CHAR = AsciiSet.create("\""),
-                       REGEX_CHARS = AsciiSet.create("+\\[]{}()^$.");
+                       META_CHARS = AsciiSet.of("*?'\""),
+                       SQ_CHAR = AsciiSet.of("'"),
+                       DQ_CHAR = AsciiSet.of("\""),
+                       REGEX_CHARS = AsciiSet.of("+\\[]{}()^$.");
 
                Pattern[] orPatterns, andPatterns, notPatterns;
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/TimeMatcherFactory.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/TimeMatcherFactory.java
index 7d70604f2..470b7d203 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/TimeMatcherFactory.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/objecttools/TimeMatcherFactory.java
@@ -106,8 +106,8 @@ public class TimeMatcherFactory extends MatcherFactory {
        private static class TimeMatcher extends AbstractMatcher {
 
                private static final AsciiSet
-                       DT = AsciiSet.create("0123456789-:T./"),
-                       WS = AsciiSet.create(" \t");
+                       DT = AsciiSet.of("0123456789-:T./"),
+                       WS = AsciiSet.of(" \t");
 
                TimestampRange[] ranges;
                List<TimestampRange> l = new LinkedList<>();
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
index 7f05c5ceb..ad5cbb716 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
@@ -362,8 +362,8 @@ public class VarResolverSession {
        }
 
        private static final AsciiSet
-               AS1 = AsciiSet.create("\\{"),
-               AS2 = AsciiSet.create("\\${}")
+               AS1 = AsciiSet.of("\\{"),
+               AS2 = AsciiSet.of("\\${}")
        ;
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
index 73f2d89be..fbff67005 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonParserSession.java
@@ -49,7 +49,7 @@ public class UonParserSession extends ReaderParserSession 
implements HttpPartPar
        
//-------------------------------------------------------------------------------------------------------------------
 
        // Characters that need to be preceded with an escape character.
-       private static final AsciiSet escapedChars = 
AsciiSet.create("~'\u0001\u0002");
+       private static final AsciiSet escapedChars = 
AsciiSet.of("~'\u0001\u0002");
 
        private static final char AMP='\u0001', EQ='\u0002';  // Flags set in 
reader to denote & and = characters.
 
@@ -887,7 +887,7 @@ public class UonParserSession extends ReaderParserSession 
implements HttpPartPar
                return ("null".equals(s) ? null : trim(s));
        }
 
-       private static final AsciiSet endCharsParam = AsciiSet.create(""+AMP), 
endCharsNormal = AsciiSet.create(",)"+AMP);
+       private static final AsciiSet endCharsParam = AsciiSet.of(""+AMP), 
endCharsNormal = AsciiSet.of(",)"+AMP);
 
 
        /*
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonUtils.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonUtils.java
index 685f454aa..d1f5d36ee 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonUtils.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonUtils.java
@@ -25,8 +25,8 @@ import org.apache.juneau.common.internal.*;
  */
 public final class UonUtils {
 
-       private static final AsciiSet needsQuoteChars = 
AsciiSet.create("),=\n\t\r\b\f ");
-       private static final AsciiSet maybeNeedsQuotesFirstChar = 
AsciiSet.create("),=\n\t\r\b\f tfn+-.#0123456789");
+       private static final AsciiSet needsQuoteChars = 
AsciiSet.of("),=\n\t\r\b\f ");
+       private static final AsciiSet maybeNeedsQuotesFirstChar = 
AsciiSet.of("),=\n\t\r\b\f tfn+-.#0123456789");
 
        /**
         * Returns <jk>true</jk> if the specified string needs to be quoted per 
UON notation.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonWriter.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonWriter.java
index d502c93a4..c9517a532 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonWriter.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonWriter.java
@@ -44,9 +44,9 @@ public final class UonWriter extends SerializerWriter {
        private static final AsciiSet unencodedCharsAttrName = 
AsciiSet.create().ranges("a-z","A-Z","0-9").chars(";/?:@-_.!*'$(),~").build();
 
        // Characters that need to be preceded with an escape character.
-       private static final AsciiSet escapedChars = AsciiSet.create("~'");
+       private static final AsciiSet escapedChars = AsciiSet.of("~'");
 
-       private static final AsciiSet noChars = AsciiSet.create("");
+       private static final AsciiSet noChars = AsciiSet.of("");
 
        private static char[] hexArray = "0123456789ABCDEF".toCharArray();
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/StringExpressionMatcher.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/StringExpressionMatcher.java
index a5bc3c592..871ffde79 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/StringExpressionMatcher.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/StringExpressionMatcher.java
@@ -51,9 +51,9 @@ public class StringExpressionMatcher {
 
        private final Exp exp;
        private static final AsciiSet
-               WS = AsciiSet.create(" \t"),
-               OP = AsciiSet.create(",|&"),
-               META = AsciiSet.create("*?");
+               WS = AsciiSet.of(" \t"),
+               OP = AsciiSet.of(",|&"),
+               META = AsciiSet.of("*?");
 
        /**
         * Constructor.
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/guard/RoleMatcher.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/guard/RoleMatcher.java
index d3680945d..be7ca6043 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/guard/RoleMatcher.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/guard/RoleMatcher.java
@@ -52,9 +52,9 @@ public class RoleMatcher {
 
        private final Exp exp;
        private static final AsciiSet
-               WS = AsciiSet.create(" \t"),
-               OP = AsciiSet.create(",|&"),
-               META = AsciiSet.create("*?");
+               WS = AsciiSet.of(" \t"),
+               OP = AsciiSet.of(",|&"),
+               META = AsciiSet.of("*?");
 
        /**
         * Constructor.
diff --git a/juneau-utest/src/test/java/org/apache/juneau/AnnotationsTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/Annotations_Test.java
similarity index 78%
rename from juneau-utest/src/test/java/org/apache/juneau/AnnotationsTest.java
rename to juneau-utest/src/test/java/org/apache/juneau/Annotations_Test.java
index 587d93de1..151fa13dc 100755
--- a/juneau-utest/src/test/java/org/apache/juneau/AnnotationsTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/Annotations_Test.java
@@ -12,24 +12,21 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau;
 
-import static org.apache.juneau.assertions.Assertions.*;
 import static org.junit.Assert.*;
 
 import org.apache.juneau.annotation.*;
 import org.junit.jupiter.api.*;
 
-@SuppressWarnings("rawtypes")
-class AnnotationsTest extends SimpleTestBase {
+class Annotations_Test extends SimpleTestBase {
 
        
//====================================================================================================
        // Bean with explicitly specified properties.
        
//====================================================================================================
        @Test void testBeanWithExplicitProperties() throws Exception {
                var bc = BeanContext.DEFAULT;
-               BeanMap bm = null;
 
                // Basic test
-               bm = 
bc.newBeanMap(Person1.class).load("{age:21,name:'foobar'}");
+               var bm = 
bc.newBeanMap(Person1.class).load("{age:21,name:'foobar'}");
                assertNotNull(bm);
                assertNotNull(bm.getBean());
                assertEquals(21, bm.get("age"));
@@ -37,8 +34,8 @@ class AnnotationsTest extends SimpleTestBase {
 
                bm.put("age", 65);
                bm.put("name", "futbol");
-               assertEquals(65, bm.get("age"));
-               assertEquals("futbol", bm.get("name"));
+               assertMap(bm, "name,age", "futbol,65");
+               assertBean(bm.getBean(), "name,age", "futbol,65");
        }
 
        /** Class with explicitly specified properties */
@@ -55,11 +52,10 @@ class AnnotationsTest extends SimpleTestBase {
        }
 
        @Test void testBeanWithExplicitProperties2() throws Exception {
-               BeanContext bc = BeanContext.DEFAULT;
-               BeanMap bm = null;
+               var bc = BeanContext.DEFAULT;
 
                // Basic test
-               bm = 
bc.newBeanMap(Person2.class).load("{age:21,name:'foobar'}");
+               var bm = 
bc.newBeanMap(Person2.class).load("{age:21,name:'foobar'}");
                assertNotNull(bm);
                assertNotNull(bm.getBean());
                assertEquals(21, bm.get("age"));
@@ -67,8 +63,8 @@ class AnnotationsTest extends SimpleTestBase {
 
                bm.put("age", 65);
                bm.put("name", "futbol");
-               assertEquals(65, bm.get("age"));
-               assertEquals("futbol", bm.get("name"));
+               assertMap(bm, "name,age", "futbol,65");
+               assertBean(bm.getBean(), "name,age", "futbol,65");
        }
 
        /** Class with explicitly specified properties */
@@ -85,11 +81,10 @@ class AnnotationsTest extends SimpleTestBase {
        }
 
        @Test void testBeanWithExplicitProperties3() throws Exception {
-               BeanContext bc = BeanContext.DEFAULT;
-               BeanMap bm = null;
+               var bc = BeanContext.DEFAULT;
 
                // Basic test
-               bm = 
bc.newBeanMap(Person3.class).load("{age:21,name:'foobar'}");
+               var bm = 
bc.newBeanMap(Person3.class).load("{age:21,name:'foobar'}");
                assertNotNull(bm);
                assertNotNull(bm.getBean());
                assertEquals(21, bm.get("age"));
@@ -97,8 +92,8 @@ class AnnotationsTest extends SimpleTestBase {
 
                bm.put("age", 65);
                bm.put("name", "futbol");
-               assertEquals(65, bm.get("age"));
-               assertEquals("futbol", bm.get("name"));
+               assertMap(bm, "name,age", "futbol,65");
+               assertBean(bm.getBean(), "name,age", "futbol,65");
        }
 
        /** Class with explicitly specified properties */
@@ -115,11 +110,10 @@ class AnnotationsTest extends SimpleTestBase {
        }
 
        @Test void testBeanWithExplicitProperties_usingConfig() throws 
Exception {
-               BeanContext bc = 
BeanContext.DEFAULT.copy().applyAnnotations(PersonConfig.class).build();
-               BeanMap bm = null;
+               var bc = 
BeanContext.DEFAULT.copy().applyAnnotations(PersonConfig.class).build();
 
                // Basic test
-               bm = 
bc.newBeanMap(Person4.class).load("{age:21,name:'foobar'}");
+               var bm = 
bc.newBeanMap(Person4.class).load("{age:21,name:'foobar'}");
                assertNotNull(bm);
                assertNotNull(bm.getBean());
                assertEquals(21, bm.get("age"));
@@ -127,8 +121,8 @@ class AnnotationsTest extends SimpleTestBase {
 
                bm.put("age", 65);
                bm.put("name", "futbol");
-               assertEquals(65, bm.get("age"));
-               assertEquals("futbol", bm.get("name"));
+               assertMap(bm, "name,age", "futbol,65");
+               assertBean(bm.getBean(), "name,age", "futbol,65");
        }
 
        /** Class with explicitly specified properties */
@@ -150,14 +144,13 @@ class AnnotationsTest extends SimpleTestBase {
        // Private/protected/default fields should be ignored.
        
//====================================================================================================
        @Test void testForOnlyPublicFields() throws Exception {
-               BeanContext bc = BeanContext.DEFAULT;
-               BeanMap bm = null;
+               var bc = BeanContext.DEFAULT;
 
                // Make sure only public fields are detected
-               bm = bc.newBeanMap(A.class).load("{publicField:123}");
+               var bm = bc.newBeanMap(A.class).load("{publicField:123}");
                assertNotNull("F1", bm);
                assertNotNull("F2", bm.getBean());
-               assertObject(bm.getBean()).asJson().is("{publicField:123}");
+               assertJson(bm.getBean(), "{publicField:123}");
        }
 
        public static class A {
diff --git a/juneau-utest/src/test/java/org/apache/juneau/BasicBeanTests.java 
b/juneau-utest/src/test/java/org/apache/juneau/BasicBeans_Test.java
similarity index 73%
rename from juneau-utest/src/test/java/org/apache/juneau/BasicBeanTests.java
rename to juneau-utest/src/test/java/org/apache/juneau/BasicBeans_Test.java
index 264cb4aa4..407ae1934 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/BasicBeanTests.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/BasicBeans_Test.java
@@ -12,18 +12,14 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau;
 
-import static org.apache.juneau.assertions.Assertions.*;
-import static org.junit.runners.MethodSorters.*;
-
 import java.beans.*;
 import java.util.*;
 
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.json.*;
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
-@FixMethodOrder(NAME_ASCENDING)
-public class BasicBeanTests {
+class BasicBeans_Test extends SimpleTestBase {
 
        
//------------------------------------------------------------------------------------------------------------------
        // Beans with transient fields and methods.
@@ -34,7 +30,7 @@ public class BasicBeanTests {
                public transient int f2;
 
                public static A1 create() {
-                       A1 x = new A1();
+                       var x = new A1();
                        x.f1 = 1;
                        x.f2 = 2;
                        return x;
@@ -44,21 +40,18 @@ public class BasicBeanTests {
        @BeanConfig(disableIgnoreTransientFields="true")
        public static class A {}
 
-       @Test
-       public void a01_testTransientFieldsIgnored() {
-               assertObject(A1.create()).asJson().is("{f1:1}");
+       @Test void a01_testTransientFieldsIgnored() {
+               assertJson(A1.create(), "{f1:1}");
        }
 
-       @Test
-       public void a02_testTransientFieldsIgnored_overrideSetting() {
-               JsonSerializer s = 
Json5Serializer.DEFAULT.copy().disableIgnoreTransientFields().build();
-               assertObject(A1.create()).asString(s).is("{f1:1,f2:2}");
+       @Test void a02_testTransientFieldsIgnored_overrideSetting() {
+               var s = 
Json5Serializer.DEFAULT.copy().disableIgnoreTransientFields().build();
+               assertSerialized(A1.create(), s, "{f1:1,f2:2}");
        }
 
-       @Test
-       public void a03_testTransientFieldsIgnored_overrideAnnotation() {
-               JsonSerializer s = 
Json5Serializer.DEFAULT.copy().applyAnnotations(A.class).build();
-               assertObject(A1.create()).asString(s).is("{f1:1,f2:2}");
+       @Test void a03_testTransientFieldsIgnored_overrideAnnotation() {
+               var s = 
Json5Serializer.DEFAULT.copy().applyAnnotations(A.class).build();
+               assertSerialized(A1.create(), s, "{f1:1,f2:2}");
        }
 
        public static class A2 {
@@ -76,16 +69,15 @@ public class BasicBeanTests {
                }
 
                public static A2 create() {
-                       A2 x = new A2();
+                       var x = new A2();
                        x.f1 = 1;
                        x.f2 = 2;
                        return x;
                }
        }
 
-       @Test
-       public void a04_testTransientMethodsIgnored() {
-               assertObject(A2.create()).asJson().is("{f1:1}");
+       @Test void a04_testTransientMethodsIgnored() {
+               assertJson(A2.create(), "{f1:1}");
        }
 
        
//------------------------------------------------------------------------------------------------------------------
@@ -97,17 +89,16 @@ public class BasicBeanTests {
                public Map<String,Integer> f1 = new TreeMap<>();
 
                public static B create() {
-                       B x = new B();
+                       var x = new B();
                        x.f1.put("a", 1);
                        return x;
                }
        }
 
-       @Test
-       public void b01_beanWithDynaProperty() throws Exception {
-               assertObject(B.create()).asJson().is("{a:1}");
+       @Test void b01_beanWithDynaProperty() throws Exception {
+               assertJson(B.create(), "{a:1}");
 
                B b = JsonParser.DEFAULT.parse("{a:1}", B.class);
-               assertObject(b).asJson().is("{a:1}");
+               assertJson(b, "{a:1}");
        }
 }
\ No newline at end of file
diff --git a/juneau-utest/src/test/java/org/apache/juneau/BeanConfigTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/BeanConfig_Test.java
similarity index 52%
rename from juneau-utest/src/test/java/org/apache/juneau/BeanConfigTest.java
rename to juneau-utest/src/test/java/org/apache/juneau/BeanConfig_Test.java
index 493d8e573..2570bc392 100755
--- a/juneau-utest/src/test/java/org/apache/juneau/BeanConfigTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/BeanConfig_Test.java
@@ -12,13 +12,14 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau;
 
-import static org.apache.juneau.assertions.Assertions.*;
-import static org.apache.juneau.internal.CollectionUtils.*;
-import static org.junit.Assert.*;
-import static org.junit.runners.MethodSorters.*;
+import static org.apache.juneau.Visibility.*;
+import static org.apache.juneau.common.internal.Utils.*;
+import static org.apache.juneau.internal.CollectionUtils.map;
+import static org.junit.jupiter.api.Assertions.*;
 
 import java.io.*;
 import java.lang.reflect.*;
+import java.time.*;
 import java.util.*;
 
 import org.apache.juneau.annotation.*;
@@ -26,107 +27,75 @@ import org.apache.juneau.collections.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.swap.*;
-import org.junit.*;
+import org.junit.jupiter.api.*;
 
 @SuppressWarnings("rawtypes")
-@FixMethodOrder(NAME_ASCENDING)
-public class BeanConfigTest {
+class BeanConfig_Test extends SimpleTestBase {
 
        
//====================================================================================================
        // testBasic
        
//====================================================================================================
-       @Test
-       public void testBasic() {
+       @Test void a01_basic() {
 
-               BeanContext bc = BeanContext.DEFAULT;
+               var bc = BeanContext.DEFAULT;
 
-               Person p1 = new Person();
+               var p1 = new Person();
                p1.setName("John Doe");
                p1.setAge(25);
 
-               Address a = new Address("101 Main St.", "Las Vegas", "NV", 
"89101");
-               AddressablePerson p2 = new AddressablePerson();
+               var a = new Address("101 Main St.", "Las Vegas", "NV", "89101");
+               var p2 = new AddressablePerson();
                p2.setName("Jane Doe");
                p2.setAge(21);
                p2.setAddress(a);
 
                // setup the reference results
-               Map m1 = new LinkedHashMap();
+               var m1 = new LinkedHashMap();
                m1.put("name", p1.getName());
                m1.put("age", Integer.valueOf(p1.getAge()));
 
-               Map m2 = new LinkedHashMap();
+               var m2 = new LinkedHashMap();
                m2.put("street", a.getStreet());
                m2.put("city", a.getCity());
                m2.put("state", a.getState());
                m2.put("zip", a.getZip());
 
-               Map m3 = new LinkedHashMap();
+               var m3 = new LinkedHashMap();
                m3.put("name", p2.getName());
                m3.put("age", Integer.valueOf(p2.getAge()));
                m3.put("address", p2.getAddress());
 
-               Map pm1 = bc.toBeanMap(p1);
+               var pm1 = bc.toBeanMap(p1);
 
-               if (pm1.size() != m1.size())
-                       fail("Bean Map size failed for: " + p1 + " / " + 
pm1.size()+ " / " + m1.size());
+               assertEquals(pm1.size(), m1.size(), ss("Bean Map size failed 
for: {0} / {1} / {2}", p1, pm1.size(), m1.size()));
+               assertEquals(pm1.keySet(), m1.keySet(), ss("Bean Map key set 
equality failed for: {0} / {1} / {2}", p1, pm1.keySet() , m1.keySet()));
+               assertEquals(m1.keySet(), pm1.keySet(), ss("Bean Map key set 
reverse equality failed for: {0} / {1} / {2}", p1, pm1.keySet(), m1.keySet()));
+               assertEquals(pm1, m1, ss("Bean Map equality failed for: {0} / 
{1} / {2}", p1, pm1, m1));  // NOSONAR
+               assertThrows(BeanRuntimeException.class, 
()->bc.newBeanMap(Address.class));  // Address returned as a new bean type, but 
shouldn't be since it doesn't have a default constructor.
+               assertNull(bc.newBeanMap(java.lang.Integer.class), 
"java.lang.Integer incorrectly designated as bean type.");
+               assertNull(bc.newBeanMap(java.lang.Class.class), 
"java.lang.Class incorrectly designated as bean type.");
 
-               if (!pm1.keySet().equals(m1.keySet()))
-                       fail("Bean Map key set equality failed for: " + p1 + " 
/ " + pm1.keySet() + " / " + m1.keySet());
+               var bm1 = bc.toBeanMap(new Address("street", "city", "state", 
"zip"));
 
-               if (!m1.keySet().equals(pm1.keySet()))
-                       fail("Bean Map key set reverse equality failed for: " + 
p1 + " / " + pm1.keySet() + " / " + m1.keySet());
+               assertEquals(bm1.size(), m2.size(), ss("Bean Adapter map's key 
set has wrong size: {0} / {1} / {2}", a, bm1.size(), m2.size()));
 
-               if (!pm1.equals(m1))
-                       fail("Bean Map equality failed for: " + p1 + " / " + 
pm1 + " / " + m1);
-
-               if (!m1.equals(pm1))
-                       fail("Bean Map reverse equality failed for: " + p1 + " 
/ " + pm1 + " / " + m1);
-
-               BeanMap bm1 = null;
-               // Address returned as a new bean type, but shouldn't be since 
it doesn't have a default constructor.
-               
assertThrown(()->bc.newBeanMap(Address.class)).isType(BeanRuntimeException.class);
-               bm1 = bc.toBeanMap(new Address("street", "city", "state", 
"zip"));
-
-               BeanMap bm2 = bc.newBeanMap(java.lang.Integer.class);
-               if (bm2 != null)
-                       fail("java.lang.Integer incorrectly desingated as bean 
type.");
-
-               BeanMap bm3 = bc.newBeanMap(java.lang.Class.class);
-               if (bm3 != null)
-                       fail("java.lang.Class incorrectly desingated as bean 
type.");
-
-               Map m4 = bm1;
-               if (m4.size() != m2.size())
-                       fail("Bean Adapter map's key set has wrong size: " + a 
+ " / " + m4.size() + " / " + m2.size());
-
-               Iterator iter = m4.keySet().iterator();
-               Set temp = new HashSet();
-               int count = 0;
+               var iter = bm1.keySet().iterator();
+               var temp = new HashSet();
+               var count = 0;
                while (iter.hasNext()) {
                        temp.add(iter.next());
                        count++;
                }
-               if (count != m2.size())
-                       fail("Iteration count over bean adpater key set failed: 
" + a + " / " + count + " / " + m2.size());
-
-               if (!m2.keySet().equals(temp))
-                       fail("Iteration over bean adpater key set failed: " + a 
+ " / " + m4.keySet() + " / " + m2.keySet());
 
-               BeanMap bm4 = bc.toBeanMap(p2);
-               if (bm4 == null) {
-                       fail("Failed to identify class as bean type: " + 
p2.getClass());
-                       return;
-               }
+               assertEquals(count, m2.size(), ss("Iteration count over bean 
adpater key set failed: {0} / {1} / {2}", a, count, m2.size()));
+               assertEquals(m2.keySet(), temp, ss("Iteration over bean adpater 
key set failed: {0} / {1} / {2}", a, bm1.keySet(), m2.keySet()));
+               assertNotNull(bc.toBeanMap(p2), ss("Failed to identify class as 
bean type: {0}", p2.getClass()));
 
-               Map m5 = bm4;
+               var m5 = bc.toBeanMap(p2);
                Set es1 = m5.entrySet();
 
-               if (!es1.equals(m3.entrySet()))
-                       fail("Entry set equality failed: " + p2 + " / " + es1 + 
" / " + m3.entrySet());
-
-               if (!m3.entrySet().equals(es1))
-                       fail("Entry set reverse equality failed: " + p2 + " / " 
+ es1 + " / " + m3.entrySet());
+               assertEquals(es1, m3.entrySet(), ss("Entry set equality failed: 
{0} / {1} / {2}", p2, es1, m3.entrySet()));
+               assertEquals(m3.entrySet(), es1, ss("Entry set reverse equality 
failed: {0} / {1} / {2}", p2, es1, m3.entrySet()));
 
                iter = es1.iterator();
                temp = new HashSet();
@@ -135,11 +104,9 @@ public class BeanConfigTest {
                        temp.add(iter.next());
                        count++;
                }
-               if (count != m3.size())
-                       fail("Iteration count over bean adpater entry set 
failed: " + a + " / " + count + " / " + m3.size());
 
-               if (!m3.entrySet().equals(temp))
-                       fail("Iteration over bean adpater entry set failed: " + 
a + " / " + es1 + " / " + m3.entrySet());
+               assertEquals(count, m3.size(), ss("Iteration count over bean 
adpater entry set failed: {0} / {1} / {2}", a, count, m3.size()));
+               assertEquals(m3.entrySet(), temp, ss("Iteration over bean 
adpater entry set failed: {0} / {1} / {2}", a, es1, m3.entrySet()));
        }
 
        public static class Person {
@@ -147,30 +114,29 @@ public class BeanConfigTest {
                private int age;
 
                public Person() {
-                       this.name = null;
-                       this.age = -1;
+                       name = null;
+                       age = -1;
                }
 
                public String getName() {
-                       return this.name;
+                       return name;
                }
 
-               public void setName(String name) {
-                       this.name = name;
+               public void setName(String v) {
+                       name = v;
                }
 
                public int getAge() {
-                       return this.age;
+                       return age;
                }
 
-               public void setAge(int age) {
-                       this.age = age;
+               public void setAge(int v) {
+                       age = v;
                }
 
                @Override /* Object */
                public String toString() {
-                       return ("Person(name: " + this.getName() + ", age: "
-                                       + this.getAge() + ")");
+                       return format("Person(name: {0}, age: {1})", name, age);
                }
        }
 
@@ -188,70 +154,34 @@ public class BeanConfigTest {
                }
 
                public String getStreet() {
-                       return this.street;
+                       return street;
                }
 
                public String getCity() {
-                       return this.city;
+                       return city;
                }
 
                public String getState() {
-                       return this.state;
+                       return state;
                }
 
                public String getZip() {
-                       return this.zip;
+                       return zip;
                }
 
                @Override /* Object */
                public boolean equals(Object o) {
-                       if (o == null)
-                               return false;
-                       if (this == o)
-                               return true;
-                       if (this.getClass() != o.getClass())
-                               return false;
-                       Address a = (Address) o;
-
-                       String v1 = this.getStreet();
-                       String v2 = a.getStreet();
-                       if ((v1 == null) ? (v2 != null) : (!v1.equals(v2)))
-                               return false;
-
-                       v1 = this.getCity();
-                       v2 = a.getCity();
-                       if ((v1 == null) ? (v2 != null) : (!v1.equals(v2)))
-                               return false;
-
-                       v1 = this.getState();
-                       v2 = a.getState();
-                       if ((v1 == null) ? (v2 != null) : (!v1.equals(v2)))
-                               return false;
-
-                       v1 = this.getZip();
-                       v2 = a.getZip();
-                       return ((v1 == null) ? (v2 == null) : (v1.equals(v2)));
+                       return eq(this, (Address)o, (x,y) -> eq(x.getStreet(), 
y.getStreet()) && eq(x.getCity(), y.getCity()) && eq(x.getState(), 
y.getState()) && eq(x.getZip(), y.getZip()));
                }
 
                @Override /* Object */
                public int hashCode() {
-                       int code = 0;
-                       if (this.street != null)
-                               code ^= this.street.hashCode();
-                       if (this.city != null)
-                               code ^= this.city.hashCode();
-                       if (this.state != null)
-                               code ^= this.state.hashCode();
-                       if (this.zip != null)
-                               code ^= this.zip.hashCode();
-                       return code;
+                       return hash(street, city, state, zip);
                }
 
                @Override /* Object */
                public String toString() {
-                       return ("Address(street: " + this.getStreet() + ", 
city: "
-                                       + this.getCity() + ", state: " + 
this.getState()
-                                       + ", zip: " + this.getZip() + ")");
+                       return format("Address(street: {0}, city: {1}, state: 
{2}, zip: {3})", street, city, state, zip);
                }
        }
 
@@ -263,11 +193,11 @@ public class BeanConfigTest {
                }
 
                public Address getAddress() {
-                       return this.address;
+                       return address;
                }
 
-               public void setAddress(Address addr) {
-                       this.address = addr;
+               public void setAddress(Address v) {
+                       address = v;
                }
 
                @Override /* Object */
@@ -279,9 +209,8 @@ public class BeanConfigTest {
        
//====================================================================================================
        // Exhaustive test of BeanContext.convertToType()
        
//====================================================================================================
-       @Test
-       public void testBeanContextConvertToType() throws Exception {
-               BeanContext bc = BeanContext.DEFAULT;
+       @Test void testBeanContextConvertToType() throws Exception {
+               var bc = BeanContext.DEFAULT;
                Object o;
 
                // Primitive nulls.
@@ -345,7 +274,7 @@ public class BeanConfigTest {
 
                // Class with Constructor(String).
                o = "xxx";
-               File file = bc.convertToType(o, File.class);
+               var file = bc.convertToType(o, File.class);
                assertEquals("xxx", file.getName());
 
                // List of ints to array
@@ -361,12 +290,12 @@ public class BeanConfigTest {
                assertEquals("x", bc.convertToType(o, 
ReadOnlyPerson[][].class)[0][0].getName());
 
                // Array of strings to array of ints
-               o = new String[] { "1", "2", "3" };
+               o = a("1", "2", "3");
                assertEquals(Integer.valueOf(1), bc.convertToType(o, 
Integer[].class)[0]);
                assertEquals(1, bc.convertToType(o, int[].class)[0]);
 
                // Array to list
-               o = new Integer[] { 1, 2, 3 };
+               o = a(1, 2, 3);
                assertEquals(Integer.valueOf(1), bc.convertToType(o, 
LinkedList.class).get(0));
 
                // HashMap to TreeMap
@@ -381,19 +310,17 @@ public class BeanConfigTest {
                assertEquals("foo", bc.convertToType(o, 
Map.class).values().iterator().next());
 
                // Array to String
-               o = new Object[] { "a", 1, false };
+               o = a("a", 1, false);
                assertEquals("['a',1,false]", bc.convertToType(o, 
String.class));
-               o = new Object[][] { { "a", 1, false } };
+               o = new Object[]{a("a", 1, false)};
                assertEquals("[['a',1,false]]", bc.convertToType(o, 
String.class));
-
        }
 
        
//====================================================================================================
        // Test properties set through a constructor.
        
//====================================================================================================
-       @Test
-       public void testReadOnlyProperties() throws Exception {
-               BeanContext bc = BeanContext.DEFAULT;
+       @Test void testReadOnlyProperties() throws Exception {
+               var bc = BeanContext.DEFAULT;
                Object o;
 
                // Bean to String
@@ -405,7 +332,6 @@ public class BeanConfigTest {
                assertEquals(1, bc.convertToType(o, 
ReadOnlyPerson[].class)[0].getAge());
        }
 
-
        @Bean(p="name,age")
        public static class ReadOnlyPerson {
                private final String name;
@@ -418,22 +344,21 @@ public class BeanConfigTest {
                }
 
                public String getName() {
-                       return this.name;
+                       return name;
                }
 
                public int getAge() {
-                       return this.age;
+                       return age;
                }
 
                @Override /* Object */
                public String toString() {
-                       return "toString():name=" + name + ",age=" + age;
+                       return format("toString():name={0},age={1}", name, age);
                }
        }
 
-       @Test
-       public void testReadOnlyProperties_usingConfig() throws Exception {
-               BeanContext bc = 
BeanContext.DEFAULT.copy().applyAnnotations(ReadOnlyPerson2Config.class).build();
+       @Test void testReadOnlyProperties_usingConfig() throws Exception {
+               var bc = 
BeanContext.DEFAULT.copy().applyAnnotations(ReadOnlyPerson2Config.class).build();
                Object o;
 
                // Bean to String
@@ -445,28 +370,26 @@ public class BeanConfigTest {
                assertEquals(1, bc.convertToType(o, 
ReadOnlyPerson2[].class)[0].getAge());
        }
 
-
        public static class ReadOnlyPerson2 {
                private final String name;
                private final int age;
 
-
                public ReadOnlyPerson2(String name, int age) {
                        this.name = name;
                        this.age = age;
                }
 
                public String getName() {
-                       return this.name;
+                       return name;
                }
 
                public int getAge() {
-                       return this.age;
+                       return age;
                }
 
                @Override /* Object */
                public String toString() {
-                       return "toString():name=" + name + ",age=" + age;
+                       return format("toString():name={0},age={1}", name, age);
                }
        }
 
@@ -481,9 +404,8 @@ public class BeanConfigTest {
        
//====================================================================================================
        // testEnums
        
//====================================================================================================
-       @Test
-       public void testEnums() throws Exception {
-               BeanContext bc = BeanContext.DEFAULT;
+       @Test void testEnums() throws Exception {
+               var bc = BeanContext.DEFAULT;
                Object o;
 
                // Enum
@@ -492,7 +414,7 @@ public class BeanConfigTest {
                assertEquals("ENUM2", bc.convertToType(TestEnum.ENUM2, 
String.class));
 
                // Array of enums
-               o = new String[] { "ENUM2" };
+               o = a("ENUM2");
                assertEquals(TestEnum.ENUM2, bc.convertToType(o, 
TestEnum[].class)[0]);
        }
 
@@ -503,41 +425,26 @@ public class BeanConfigTest {
        
//====================================================================================================
        // testProxyHandler
        
//====================================================================================================
-       @Test
-       public void testProxyHandler() {
-               BeanSession session = BeanContext.DEFAULT_SESSION;
-
-               A f1 = (A) Proxy.newProxyInstance(this.getClass()
-                               .getClassLoader(), new Class[] { A.class },
-                               new AHandler());
-
-               BeanMap bm1 = session.toBeanMap(f1);
-               if (bm1 == null) {
-                       fail("Failed to obtain bean adapter for proxy: " + f1);
-                       return;
-               }
+       @Test void testProxyHandler() {
+               var session = BeanContext.DEFAULT_SESSION;
+
+               var f1 = (A) 
Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[] { A.class 
}, new AHandler());
+
+               var bm1 = session.toBeanMap(f1);
+               assertNotNull(bm1, ss("Failed to obtain bean adapter for proxy: 
{0}", f1));
+
+               var bm2 = session.newBeanMap(A.class);
+               assertNotNull(bm2, ss("Failed to create dynamic proxy bean for 
interface: {0}", A.class.getName()));
 
-               BeanMap bm2 = session.newBeanMap(A.class);
-               if (bm2 == null) {
-                       fail("Failed to create dynamic proxy bean for 
interface: " + A.class.getName());
-                       return;
-               }
                bm2.put("a", "Hello");
                bm2.put("b", Integer.valueOf(50));
                f1.setA("Hello");
                f1.setB(50);
 
-               if (!bm2.get("a").equals("Hello"))
-                       fail("Failed to set string property 'a' on dynamic 
proxy bean.  " + bm2);
-
-               if (!bm2.get("b").equals(Integer.valueOf(50)))
-                       fail("Failed to set string property 'b' on dynamic 
proxy bean.  " + bm2);
-
-               if (!bm1.equals(bm2))
-                       fail("Failed equality test of dynamic proxies beans: " 
+ bm1 + " / " + bm2);
-
-               if (!bm2.equals(bm1))
-                       fail("Failed reverse equality test of dynamic proxies 
beans: " + bm1 + " / " + bm2);
+               assertEquals(bm2.get("a"), "Hello", ss("Failed to set string 
property 'a' on dynamic proxy bean. {0}", bm2));  // NOSONAR
+               assertEquals(bm2.get("b"), Integer.valueOf(50), ss("Failed to 
set string property 'b' on dynamic proxy bean. {0}", bm2));
+               assertEquals(bm1, bm2, ss("Failed equality test of dynamic 
proxies beans: {0} / {1}", bm1, bm2));
+               assertEquals(bm2, bm1, ss("Failed reverse equality test of 
dynamic proxies beans: {0} / {1}", bm1, bm2));
        }
 
        public interface A {
@@ -554,31 +461,30 @@ public class BeanConfigTest {
                private Map map;
 
                public AHandler() {
-                       this.map = new HashMap();
-                       this.map.put("a", "");
-                       this.map.put("b", Integer.valueOf(0));
+                       map = new HashMap();
+                       map.put("a", "");
+                       map.put("b", Integer.valueOf(0));
                }
 
                @Override /* InvocationHandler */
-               public Object invoke(Object proxy, Method method, Object[] args)
-                               throws Throwable {
-                       String methodName = method.getName();
+               public Object invoke(Object proxy, Method method, Object[] 
args) throws Throwable {
+                       var methodName = method.getName();
                        if (methodName.equals("getA")) {
-                               return this.map.get("a");
+                               return map.get("a");
                        }
                        if (methodName.equals("setA")) {
-                               this.map.put("a", args[0]);
+                               map.put("a", args[0]);
                                return null;
                        }
                        if (methodName.equals("getB")) {
-                               return this.map.get("b");
+                               return map.get("b");
                        }
                        if (methodName.equals("setB")) {
-                               this.map.put("b", args[0]);
+                               map.put("b", args[0]);
                                return null;
                        }
                        if (methodName.equals("toString")) {
-                               return this.map.toString();
+                               return map.toString();
                        }
                        return null;
                }
@@ -587,10 +493,9 @@ public class BeanConfigTest {
        
//====================================================================================================
        // testFluentStyleSetters
        
//====================================================================================================
-       @Test
-       public void testFluentStyleSetters() {
-               B2 t = new B2().init();
-               BeanMap m = BeanContext.DEFAULT.toBeanMap(t);
+       @Test void testFluentStyleSetters() {
+               var t = new B2().init();
+               var m = BeanContext.DEFAULT.toBeanMap(t);
                m.put("f1", 2);
                assertEquals(2, t.f1);
        }
@@ -598,181 +503,110 @@ public class BeanConfigTest {
        public static class B {
                int f1;
                public int getF1() { return f1; }
-               public B setF1(int f1) { this.f1 = f1; return this; }
+               public B setF1(int v) { f1 = v; return this; }
        }
 
        public static class B2 extends B {
                @Override /* B */
-               public B2 setF1(int f1) { this.f1 = f1; return this; }
-               public B2 init() { this.f1 = 1; return this;}
+               public B2 setF1(int v) { f1 = v; return this; }
+               public B2 init() { f1 = 1; return this;}
        }
 
        
//====================================================================================================
        // testClassMetaCaching
        
//====================================================================================================
-       @Test
-       public void testClassMetaCaching() {
-               Parser.Builder p1, p2;
-
-               p1 = JsonParser.create();
-               p2 = JsonParser.create();
-               assertSameCache(p1, p2);
-
-               p1.beansRequireDefaultConstructor();
-               assertDifferentCache(p1, p2);
-               p2.beansRequireDefaultConstructor();
-               assertSameCache(p1, p2);
-
-               p1.beansRequireSerializable();
-               assertDifferentCache(p1, p2);
-               p2.beansRequireSerializable();
-               assertSameCache(p1, p2);
-
-               p1.beansRequireSettersForGetters();
-               assertDifferentCache(p1, p2);
-               p2.beansRequireSettersForGetters();
-               assertSameCache(p1, p2);
-
-               p1.disableBeansRequireSomeProperties();
-               assertDifferentCache(p1, p2);
-               p2.disableBeansRequireSomeProperties();
-               assertSameCache(p1, p2);
-
-               p1.beanMapPutReturnsOldValue();
-               assertDifferentCache(p1, p2);
-               p2.beanMapPutReturnsOldValue();
-               assertSameCache(p1, p2);
-
-               p1.beanConstructorVisibility(Visibility.DEFAULT);
-               assertDifferentCache(p1, p2);
-               p2.beanConstructorVisibility(Visibility.DEFAULT);
-               assertSameCache(p1, p2);
-               p1.beanConstructorVisibility(Visibility.NONE);
-               assertDifferentCache(p1, p2);
-               p2.beanConstructorVisibility(Visibility.NONE);
-               assertSameCache(p1, p2);
-               p1.beanConstructorVisibility(Visibility.PRIVATE);
-               assertDifferentCache(p1, p2);
-               p2.beanConstructorVisibility(Visibility.PRIVATE);
-               assertSameCache(p1, p2);
-               p1.beanConstructorVisibility(Visibility.PROTECTED);
-               assertDifferentCache(p1, p2);
-               p2.beanConstructorVisibility(Visibility.PROTECTED);
-               assertSameCache(p1, p2);
-
-               p1.beanClassVisibility(Visibility.DEFAULT);
-               assertDifferentCache(p1, p2);
-               p2.beanClassVisibility(Visibility.DEFAULT);
-               assertSameCache(p1, p2);
-               p1.beanClassVisibility(Visibility.NONE);
-               assertDifferentCache(p1, p2);
-               p2.beanClassVisibility(Visibility.NONE);
-               assertSameCache(p1, p2);
-               p1.beanClassVisibility(Visibility.PRIVATE);
-               assertDifferentCache(p1, p2);
-               p2.beanClassVisibility(Visibility.PRIVATE);
-               assertSameCache(p1, p2);
-               p1.beanClassVisibility(Visibility.PROTECTED);
-               assertDifferentCache(p1, p2);
-               p2.beanClassVisibility(Visibility.PROTECTED);
-               assertSameCache(p1, p2);
-
-               p1.beanFieldVisibility(Visibility.DEFAULT);
-               assertDifferentCache(p1, p2);
-               p2.beanFieldVisibility(Visibility.DEFAULT);
-               assertSameCache(p1, p2);
-               p1.beanFieldVisibility(Visibility.NONE);
-               assertDifferentCache(p1, p2);
-               p2.beanFieldVisibility(Visibility.NONE);
-               assertSameCache(p1, p2);
-               p1.beanFieldVisibility(Visibility.PRIVATE);
-               assertDifferentCache(p1, p2);
-               p2.beanFieldVisibility(Visibility.PRIVATE);
-               assertSameCache(p1, p2);
-               p1.beanFieldVisibility(Visibility.PROTECTED);
-               assertDifferentCache(p1, p2);
-               p2.beanFieldVisibility(Visibility.PROTECTED);
-               assertSameCache(p1, p2);
-
-               p1.beanMethodVisibility(Visibility.DEFAULT);
-               assertDifferentCache(p1, p2);
-               p2.beanMethodVisibility(Visibility.DEFAULT);
-               assertSameCache(p1, p2);
-               p1.beanMethodVisibility(Visibility.NONE);
-               assertDifferentCache(p1, p2);
-               p2.beanMethodVisibility(Visibility.NONE);
-               assertSameCache(p1, p2);
-               p1.beanMethodVisibility(Visibility.PRIVATE);
-               assertDifferentCache(p1, p2);
-               p2.beanMethodVisibility(Visibility.PRIVATE);
-               assertSameCache(p1, p2);
-               p1.beanMethodVisibility(Visibility.PROTECTED);
-               assertDifferentCache(p1, p2);
-               p2.beanMethodVisibility(Visibility.PROTECTED);
-               assertSameCache(p1, p2);
-
-               p1.useJavaBeanIntrospector();
-               assertDifferentCache(p1, p2);
-               p2.useJavaBeanIntrospector();
-               assertSameCache(p1, p2);
-
-               p1.disableInterfaceProxies();
-               assertDifferentCache(p1, p2);
-               p2.disableInterfaceProxies();
-               assertSameCache(p1, p2);
-
-               p1.ignoreUnknownBeanProperties();
-               assertDifferentCache(p1, p2);
-               p2.ignoreUnknownBeanProperties();
-               assertSameCache(p1, p2);
-
-               p1.disableIgnoreUnknownNullBeanProperties();
-               assertDifferentCache(p1, p2);
-               p2.disableIgnoreUnknownNullBeanProperties();
-               assertSameCache(p1, p2);
-
-               p1.disableIgnoreMissingSetters();
-               assertDifferentCache(p1, p2);
-               p2.disableIgnoreMissingSetters();
-               assertSameCache(p1, p2);
-
-               p1.ignoreInvocationExceptionsOnGetters();
-               assertDifferentCache(p1, p2);
-               p2.ignoreInvocationExceptionsOnGetters();
-               assertSameCache(p1, p2);
-
-               p1.ignoreInvocationExceptionsOnSetters();
-               assertDifferentCache(p1, p2);
-               p2.ignoreInvocationExceptionsOnSetters();
-               assertSameCache(p1, p2);
-
-               p1.notBeanPackages("foo");
-               assertDifferentCache(p1, p2);
-               p2.notBeanPackages("foo");
-               assertSameCache(p1, p2);
-               p1.notBeanPackages("bar");
-               assertDifferentCache(p1, p2);
-               p2.notBeanPackages("bar");
-               assertSameCache(p1, p2);
-               p1.notBeanPackages("baz");
-               p1.notBeanPackages("bing");
-               assertDifferentCache(p1, p2);
-               p2.notBeanPackages("bing");
-               p2.notBeanPackages("baz");
-               assertSameCache(p1, p2);
+       @Test void testClassMetaCaching() {
+               var p1 = JsonParser.create();
+               var p2 = JsonParser.create();
+               assertSameCache(p1, p2);
+
+               assertDifferentCache(p1.beansRequireDefaultConstructor(), p2);
+               assertSameCache(p1, p2.beansRequireDefaultConstructor());
+
+               assertDifferentCache(p1.beansRequireSerializable(), p2);
+               assertSameCache(p1, p2.beansRequireSerializable());
+
+               assertDifferentCache(p1.beansRequireSettersForGetters(), p2);
+               assertSameCache(p1, p2.beansRequireSettersForGetters());
+
+               assertDifferentCache(p1.disableBeansRequireSomeProperties(), 
p2);
+               assertSameCache(p1, p2.disableBeansRequireSomeProperties());
+
+               assertDifferentCache(p1.beanMapPutReturnsOldValue(), p2);
+               assertSameCache(p1, p2.beanMapPutReturnsOldValue());
+
+               assertDifferentCache(p1.beanConstructorVisibility(DEFAULT), p2);
+               assertSameCache(p1, p2.beanConstructorVisibility(DEFAULT));
+               assertDifferentCache(p1.beanConstructorVisibility(NONE), p2);
+               assertSameCache(p1, p2.beanConstructorVisibility(NONE));
+               assertDifferentCache(p1.beanConstructorVisibility(PRIVATE), p2);
+               assertSameCache(p1, p2.beanConstructorVisibility(PRIVATE));
+               assertDifferentCache(p1.beanConstructorVisibility(PROTECTED), 
p2);
+               assertSameCache(p1, p2.beanConstructorVisibility(PROTECTED));
+
+               assertDifferentCache(p1.beanClassVisibility(DEFAULT), p2);
+               assertSameCache(p1, p2.beanClassVisibility(DEFAULT));
+               assertDifferentCache(p1.beanClassVisibility(NONE), p2);
+               assertSameCache(p1, p2.beanClassVisibility(NONE));
+               assertDifferentCache(p1.beanClassVisibility(PRIVATE), p2);
+               assertSameCache(p1, p2.beanClassVisibility(PRIVATE));
+               assertDifferentCache(p1.beanClassVisibility(PROTECTED), p2);
+               assertSameCache(p1, p2.beanClassVisibility(PROTECTED));
+
+               assertDifferentCache(p1.beanFieldVisibility(DEFAULT), p2);
+               assertSameCache(p1, p2.beanFieldVisibility(DEFAULT));
+               assertDifferentCache(p1.beanFieldVisibility(NONE), p2);
+               assertSameCache(p1, p2.beanFieldVisibility(NONE));
+               assertDifferentCache(p1.beanFieldVisibility(PRIVATE), p2);
+               assertSameCache(p1, p2.beanFieldVisibility(PRIVATE));
+               assertDifferentCache(p1.beanFieldVisibility(PROTECTED), p2);
+               assertSameCache(p1, p2.beanFieldVisibility(PROTECTED));
+
+               assertDifferentCache(p1.beanMethodVisibility(DEFAULT), p2);
+               assertSameCache(p1, p2.beanMethodVisibility(DEFAULT));
+               assertDifferentCache(p1.beanMethodVisibility(NONE), p2);
+               assertSameCache(p1, p2.beanMethodVisibility(NONE));
+               assertDifferentCache(p1.beanMethodVisibility(PRIVATE), p2);
+               assertSameCache(p1, p2.beanMethodVisibility(PRIVATE));
+               assertDifferentCache(p1.beanMethodVisibility(PROTECTED), p2);
+               assertSameCache(p1, p2.beanMethodVisibility(PROTECTED));
+
+               assertDifferentCache(p1.useJavaBeanIntrospector(), p2);
+               assertSameCache(p1, p2.useJavaBeanIntrospector());
+
+               assertDifferentCache(p1.disableInterfaceProxies(), p2);
+               assertSameCache(p1, p2.disableInterfaceProxies());
+
+               assertDifferentCache(p1.ignoreUnknownBeanProperties(), p2);
+               assertSameCache(p1, p2.ignoreUnknownBeanProperties());
+
+               
assertDifferentCache(p1.disableIgnoreUnknownNullBeanProperties(), p2);
+               assertSameCache(p1, 
p2.disableIgnoreUnknownNullBeanProperties());
+
+               assertDifferentCache(p1.disableIgnoreMissingSetters(), p2);
+               assertSameCache(p1, p2.disableIgnoreMissingSetters());
+
+               assertDifferentCache(p1.ignoreInvocationExceptionsOnGetters(), 
p2);
+               assertSameCache(p1, p2.ignoreInvocationExceptionsOnGetters());
+
+               assertDifferentCache(p1.ignoreInvocationExceptionsOnSetters(), 
p2);
+               assertSameCache(p1, p2.ignoreInvocationExceptionsOnSetters());
+
+               assertDifferentCache(p1.notBeanPackages("foo"), p2);
+               assertSameCache(p1, p2.notBeanPackages("foo"));
+               assertDifferentCache(p1.notBeanPackages("bar"), p2);
+               assertSameCache(p1, p2.notBeanPackages("bar"));
+               
assertDifferentCache(p1.notBeanPackages("baz").notBeanPackages("bing"), p2);
+               
assertSameCache(p2.notBeanPackages("bing").notBeanPackages("baz"), p2);
 
                p1.beanContext().notBeanPackages().remove("bar");
                assertDifferentCache(p1, p2);
                p2.beanContext().notBeanPackages().remove("bar");
                assertSameCache(p1, p2);
 
-               p1.swaps(DummyPojoSwapA.class);
-               assertDifferentCache(p1, p2);
-               p2.swaps(DummyPojoSwapA.class);
-               assertSameCache(p1, p2);
-               p1.swaps(DummyPojoSwapB.class,DummyPojoSwapC.class);  // Order 
of filters is important!
-               p2.swaps(DummyPojoSwapC.class,DummyPojoSwapB.class);
-               assertDifferentCache(p1, p2);
+               assertDifferentCache(p1.swaps(DummyPojoSwapA.class), p2);
+               assertSameCache(p1, p2.swaps(DummyPojoSwapA.class));
+               
assertDifferentCache(p1.swaps(DummyPojoSwapB.class,DummyPojoSwapC.class), 
p2.swaps(DummyPojoSwapC.class,DummyPojoSwapB.class));  // Order of filters is 
important!
        }
 
        public static class DummyPojoSwapA extends MapSwap<A> {}
@@ -781,22 +615,23 @@ public class BeanConfigTest {
        public static class C {}
 
        private void assertSameCache(Parser.Builder p1b, Parser.Builder p2b) {
-               Parser p1 = p1b.build(), p2 = p2b.build();
+               var p1 = p1b.build();
+               var p2 = p2b.build();
                
assertTrue(p1.getBeanContext().hasSameCache(p2.getBeanContext()));
        }
 
        private void assertDifferentCache(Parser.Builder p1b, Parser.Builder 
p2b) {
-               Parser p1 = p1b.build(), p2 = p2b.build();
+               var p1 = p1b.build();
+               var p2 = p2b.build();
                
assertFalse(p1.getBeanContext().hasSameCache(p2.getBeanContext()));
        }
 
        
//====================================================================================================
        // testNotABeanReasons
        
//====================================================================================================
-       @Test
-       public void testNotABeanNonStaticInnerClass() {
-               BeanContext bc = BeanContext.DEFAULT;
-               ClassMeta cm = bc.getClassMeta(C1.class);
+       @Test void testNotABeanNonStaticInnerClass() {
+               var bc = BeanContext.DEFAULT;
+               var cm = bc.getClassMeta(C1.class);
                assertFalse(cm.canCreateNewInstance());
        }
 
@@ -810,21 +645,23 @@ public class BeanConfigTest {
        // For performance reasons, array properties are stored as temporary 
ArrayLists until the
        // BeanMap.getBean() method is called.
        
//====================================================================================================
-       @Test(timeout=1000) // Should be around 100ms at most.
-       public void testAddingToArrayProperty() {
-               BeanContext bc = BeanContext.DEFAULT;
-               BeanMap<D> bm = bc.newBeanMap(D.class);
-               for (int i = 0; i < 5000; i++) {
-                       bm.add("f1", i);
-                       bm.add("f2", i);
-                       bm.add("f3", i);
-                       bm.add("f4", i);
-               }
-               D d = bm.getBean();
-               assertEquals(5000, d.f1.length);
-               assertEquals(5000, d.f2.length);
-               assertEquals(5003, d.f3.length);
-               assertEquals(5003, d.f4.length);
+       // Should be around 100ms at most.
+       @Test void testAddingToArrayProperty() {
+               assertTimeout(Duration.ofSeconds(1), () -> {
+                       var bc = BeanContext.DEFAULT;
+                       var bm = bc.newBeanMap(D.class);
+                       for (var i = 0; i < 5000; i++) {
+                               bm.add("f1", i);
+                               bm.add("f2", i);
+                               bm.add("f3", i);
+                               bm.add("f4", i);
+                       }
+                       var d = bm.getBean();
+                       assertEquals(5000, d.f1.length);
+                       assertEquals(5000, d.f2.length);
+                       assertEquals(5003, d.f3.length);
+                       assertEquals(5003, d.f4.length);
+               });
        }
 
        public class D {
@@ -833,30 +670,25 @@ public class BeanConfigTest {
                public int[] f3 = {1,2,3};
                private int[] f4 = {1,2,3};
                public int[] getF2() {return f2;}
-               public void setF2(int[] f2) {this.f2 = f2;}
+               public void setF2(int[] v) {f2 = v;}
                public int[] getF4() {return f4;}
-               public void setF4(int[] f4) {this.f4 = f4;}
+               public void setF4(int[] v) {f4 = v;}
        }
 
        
//====================================================================================================
        // testClassClassMeta
        // Make sure we can get ClassMeta objects against the Class class.
        
//====================================================================================================
-       @Test
-       public void testClassClassMeta() {
-               ClassMeta cm = BeanContext.DEFAULT.getClassMeta(Class.class);
-               assertNotNull(cm);
-
-               cm = BeanContext.DEFAULT.getClassMeta(Class[].class);
-               assertNotNull(cm);
+       @Test void testClassClassMeta() {
+               assertNotNull(BeanContext.DEFAULT.getClassMeta(Class.class));
+               assertNotNull(BeanContext.DEFAULT.getClassMeta(Class[].class));
        }
 
        
//====================================================================================================
        // testBlanks
        
//====================================================================================================
-       @Test
-       public void testBlanks() throws Exception {
-               BeanContext bc = BeanContext.DEFAULT;
+       @Test void testBlanks() throws Exception {
+               var bc = BeanContext.DEFAULT;
 
                // Blanks get interpreted as the default value for primitives 
and null for boxed objects.
                assertEquals(0, (int)bc.convertToType("", int.class));
diff --git a/juneau-utest/src/test/java/org/apache/juneau/SimpleTestBase.java 
b/juneau-utest/src/test/java/org/apache/juneau/SimpleTestBase.java
index f20fc2af6..dca72c21c 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/SimpleTestBase.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/SimpleTestBase.java
@@ -13,18 +13,20 @@
 package org.apache.juneau;
 
 import static org.apache.juneau.utest.utils.Utils2.*;
+import static org.apache.juneau.common.internal.StringUtils.*;
 import static java.util.Optional.*;
+import static java.util.stream.Collectors.*;
 
 import static org.junit.jupiter.api.Assertions.*;
 
 import java.lang.reflect.*;
 import java.util.*;
-import java.util.regex.*;
+import java.util.function.*;
 
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.common.internal.*;
-import org.apache.juneau.common.utils.*;
 import org.apache.juneau.marshaller.*;
+import org.apache.juneau.serializer.*;
 import org.junit.jupiter.api.*;
 import org.junit.jupiter.api.MethodOrderer.*;
 
@@ -34,9 +36,11 @@ import org.junit.jupiter.api.MethodOrderer.*;
 @TestMethodOrder(MethodName.class)
 public abstract class SimpleTestBase {
 
-       /** Assert value when stringified matches the specified pattern. */
-       protected void assertMatches(String pattern, Object value) {
-               var m = StringUtils.getMatchPattern(pattern).matcher(s(value));
+       /**
+        * Asserts value when stringified matches the specified pattern.
+        */
+       protected static void assertMatches(String pattern, Object value) {
+               var m = getMatchPattern(pattern).matcher(s(value));
                if (! m.matches()) {
                        var msg = "Pattern didn't match: 
\n\tExpected:\n"+pattern+"\n\tActual:\n"+value;
                        System.err.println(msg);  // For easier debugging.
@@ -44,158 +48,166 @@ public abstract class SimpleTestBase {
                }
        }
 
-       protected void assertJson(Object value, String json) {
+       /**
+        * Asserts the JSON5 representation of the specified object.
+        */
+       protected static void assertJson(Object value, String json) {
                assertEquals(json, Json5.DEFAULT.write(value));
        }
 
        /**
-        * Asserts an object matches the expected string after it's been 
stringified.
+        * Asserts the serialized representation of the specified object.
         */
-       protected void assertString(String expected, Object actual) {
-               assertEquals(expected, s(actual));
+       protected static void assertSerialized(Object value, WriterSerializer 
s, String json) {
+               assertEquals(json, s.toString(value));
        }
 
-       protected void assertNotEmpty(Collection<?> c) {
-               assertTrue(c != null && ! c.isEmpty());
+       /**
+        * Asserts an object matches the expected string after it's been made 
readable.
+        */
+       protected static void assertString(String expected, Object actual) {
+               assertEquals(expected, r(actual));
        }
 
-       protected void assertNotEmpty(Map<?,?> c) {
-               assertTrue(c != null && ! c.isEmpty());
+       /**
+        * Asserts the entries in an array matches the expected strings after 
they've been made readable.
+        */
+       protected static void assertArray(Object array, String...expected) {
+               if (Array.getLength(array) != expected.length)
+                       ffail("Wrong array length.  expected={0}, actual={1}", 
expected.length, Array.getLength(array));
+               for (var i = 0; i < expected.length; i++)
+                       if (ne(r(Array.get(array, i)), expected[i]))
+                               ffail("Element at index {0} did not match.  
expected={1}, actual={2}", i, expected[i], r(Array.get(array, i)));
        }
 
-       protected void assertEmpty(Collection<?> c) {
-               assertTrue(c != null && c.isEmpty());
+       /**
+        * Asserts the entries in a list matches the expected strings after 
they've been made readable.
+        */
+       protected static void assertList(List<?> list, String...expected) {
+               if (list.size() != expected.length)
+                       ffail("Wrong list length.  expected={0}, actual={1}", 
expected.length, list.size());
+               for (var i = 0; i < expected.length; i++)
+                       if (ne(r(list.get(i)), expected[i]))
+                               ffail("Element at index {0} did not match.  
expected={1}, actual={2}", i, expected[i], r(list.get(i)));
        }
 
-       protected void assertSize(int expected, Collection<?> c) {
-               assertEquals(expected, 
ofNullable(c).map(Collection::size).orElse(-1));
+       /**
+        * Formatted fail.
+        */
+       protected static void ffail(String msg, Object...args) {
+               fail(StringUtils.format(msg, args));
        }
 
        /**
-        * Asserts an exception is thrown and contains the specified message.
-        * Example:  assertThrown(()->doSomething(), "My exception message:  
foo*");
+        * Asserts the entries in a map matches the expected strings after 
they've been made readable.
         */
-       protected void assertThrown(Snippet snippet, String msg) {
-               try {
-                       snippet.run();
-                       fail("Exception not thrown.");
-               } catch (Throwable e) {
-                       if (! StringUtils.getMatchPattern(msg, 
Pattern.DOTALL).matcher(e.getMessage()).matches()) {
-                               System.err.println("Thrown message didn't 
match.  Message=" + e.getMessage());
-                               fail("Thrown message didn't match.  Message=" + 
e.getMessage());
-                       }
-               }
+       protected static void assertMap(Map<?,?> map, String...expected) {
+               assertList(map.entrySet().stream().map(x -> r(x.getKey()) + "=" 
+ r(x.getValue())).toList(), expected);
        }
 
-       protected void assertThrown(Snippet snippet, Class<? extends Throwable> 
thrownType) {
-               try {
-                       snippet.run();
-                       fail("Exception not thrown.");
-               } catch (AssertionError e) {
-                       throw e;
-               } catch (Throwable e) {
-                       assertTrue(thrownType.isInstance(e), ()->"Wrong type 
thrown: " + e.getClass().getName());
-               }
+       /**
+        * Asserts that a collection is not null or empty.
+        */
+       protected static void assertNotEmpty(Collection<?> c) {
+               assertTrue(c != null && ! c.isEmpty());
        }
 
        /**
-        * Asserts an exception is not thrown
-        * Example:  assertThrown(()->doSomething());
+        * Asserts that a maps is not null or empty.
         */
-       protected void assertNotThrown(Snippet snippet) {
-               try {
-                       snippet.run();
-               } catch (Throwable e) {
-                       fail("Exception thrown.");
-               }
+       protected static void assertNotEmpty(Map<?,?> c) {
+               assertTrue(c != null && ! c.isEmpty());
+       }
+
+       /**
+        * Asserts that a collection is not null and empty.
+        */
+       protected static void assertEmpty(Collection<?> c) {
+               assertTrue(c != null && c.isEmpty());
+       }
+
+       /**
+        * Asserts that a collection is not null and of the specified size.
+        */
+       protected static void assertSize(int expected, Collection<?> c) {
+               assertEquals(expected, 
ofNullable(c).map(Collection::size).orElse(-1));
        }
 
        /**
-        * Asserts that the fields/properties on the specified bean are the 
specified values.
-        * Collections and calendars are serialized consistently for ease of 
testing.
+        * Asserts that the fields/properties on the specified bean are the 
specified values after being converted to readable strings.
+        *
         * Example:
         *      assertBean(
         *              myBean,
         *              "prop1,prop2,prop3"
         *              "val1,val2,val3"
         *      );
+        *
+        * Subsets of properties on nested beans can also be specified by 
appending arbitrarily-nested "{...}" constructs to property names.
+        *      assertBean(
+        *              myBean,
+        *              "prop1{prop1a,prop1b},prop2,prop3"
+        *              "val1{val1a,val1b},val2,val3"
+        *      );
+        * This also works for lists and arrays when numeric subproperty names 
are used.
+        *      assertBean(
+        *              myBean,
+        *              "myListProp{0,1,2},prop2,prop3"
+        *              "val1{val1a,val1b,val1c},val2,val3"
+        *      );
         */
-       protected void assertBean(Object o, String fields, String value) {
+       protected static void assertBean(Object o, String fields, String value) 
{
                if (o == null) throw new NullPointerException("Bean was null");
-               var sb = new StringBuilder();
-               var f = StringUtils.split(fields);
-               for (var i = 0; i < f.length; i++) {
-                       if (i > 0) sb.append(",");
-                       sb.append(s(getBeanProp(o, f[i])));
-               }
-               assertEquals(value, sb.toString());
+               assertEquals(value, splitNested(fields).stream().map(x -> 
getReadableEntry(o, x)).collect(joining(",")));
        }
 
        /**
-        * Asserts that the values of the specified fields match the list of 
beans.
+        * Asserts that the values in the specified map are the specified 
values after being converted to readable strings.
+        * Example:
+        *      assertMap(
+        *              myMap,
+        *              "prop1,prop2,prop3"
+        *              "val1,val2,val3"
+        *      );
+        */
+       protected static void assertMap(Map<?,?> o, String fields, String 
value) {
+               if (o == null) throw new NullPointerException("Map was null");
+               assertEquals(value, cdl(fields).stream().map(x -> 
getReadableEntry(o, x)).collect(joining(",")));
+       }
+
+       /**
+        * Asserts that the values of the specified fields match the list of 
beans after being converted to readable strings.
         * @param l The list of beans to check.
         * @param fields A comma-delimited list of bean property names.
         * @param values The comma-delimited list of values for each bean.
         */
        @SuppressWarnings("rawtypes")
-       protected void assertBeans(Collection l, String fields, 
Object...values) {
+       protected static void assertBeans(Collection l, String fields, 
Object...values) {
                assertEquals(values.length, l.size(), ()->"Expected 
"+values.length+" rows but had actual " + l.size());
                var r = 0;
-               var f = StringUtils.split(fields);
+               var f = splitNested(fields);
                for (var o : l) {
-                       var sb = new StringBuilder();
-                       var first = true;
-                       for (var ff : f) {
-                               if (! first) sb.append(",");
-                               first = false;
-                               String[] subfields = null;
-                               if (contains(ff, '{')) {
-                                       subfields = 
ff.substring(ff.indexOf('{')+1, ff.indexOf("}")).split(":");
-                                       ff = ff.substring(0, ff.indexOf('{'));
-                               }
-                               var bp = getBeanProp(o, ff);
-                               if (subfields != null) {
-                                       if (isListOrArray(bp)) {
-                                               sb.append("[");
-                                               for (var i = 0; i < length(bp); 
i++) {
-                                                       if (i > 0) 
sb.append(",");
-                                                       
sb.append(beanProps(get(bp, i), subfields));
-                                               }
-                                               sb.append("]");
-                                       } else {
-                                               sb.append(beanProps(bp, 
subfields));
-                                       }
-                               } else {
-                                       sb.append(s(getBeanProp(o, ff)));
-                               }
-                       }
-                       assertEquals(s(values[r]), sb.toString(), "Object at 
row " + (r+1) + " didn't match.");
+                       var actual = f.stream().map(x -> getReadableEntry(o, 
x)).collect(joining(","));
+                       var r2 = r+1;
+                       assertEquals(r(values[r]), actual, ()->"Object at row " 
+ r2 + " didn't match.");
                        r++;
                }
        }
 
-       /**
-        * Returns the specified bean properties on the specified bean as a 
comma-delimited list.
-        */
-       private String beanProps(Object o, String[] properties) {
-               if (o == null) return "null";
-               var sb = new StringBuilder();
-               sb.append("{");
-               for (var i = 0; i < properties.length; i++) {
-                       if (i > 0) sb.append(",");
-                       sb.append(s(getBeanProp(o, properties[i])));
-               }
-               sb.append("}");
-               return sb.toString();
+       private static String getReadableEntry(Object o, String name) {
+               var i = name.indexOf("{");
+               var pn = i == -1 ? name : name.substring(0, i);
+               var spn = i == -1 ? null : splitNestedInner(name);
+               var e = getEntry(o, pn);
+               if (spn == null) return r(e);
+               return spn.stream().map(x -> getReadableEntry(e, 
x)).collect(joining(","));
        }
 
-       /**
-        * Returns the specified element from a List or array.
-        */
-       private Object get(Object o, int i) {
-               if (o instanceof List) return ((List<?>)o).get(i);
-               if (o.getClass().isArray()) return Array.get(o, i);
-               throw new RuntimeException("Invalid data type for 
length(Object): " + o.getClass().getSimpleName());
+       private static Object getEntry(Object o, String name) {
+               if (o instanceof List) return 
List.class.cast(o).get(Integer.parseInt(name));
+               if (o.getClass().isArray()) return Array.get(o, 
Integer.parseInt(name));
+               if (o instanceof Map) return Map.class.cast(o).get(name);
+               return getBeanProp(o, name);
        }
 
        /**
@@ -212,16 +224,16 @@ public abstract class SimpleTestBase {
         * Methods and fields can be any visibility.
         */
        public static Object getBeanProp(Object o, String name) {
-               return Utils.safe(() -> {
-                       Field f = null;
-                       Class<?> c = o.getClass();
+               return safe(() -> {
+                       var f = (Field)null;
+                       var c = o.getClass();
                        var n = Character.toUpperCase(name.charAt(0)) + 
name.substring(1);
                        var m = Arrays.stream(c.getMethods()).filter(x -> 
isGetter(x, n)).filter(x -> x.getAnnotation(BeanIgnore.class) == 
null).findFirst().orElse(null);
                        if (m != null) {
                                m.setAccessible(true);
                                return m.invoke(o);
                        }
-                       Class<?> c2 = c;
+                       var c2 = c;
                        while (f == null && c2 != null) {
                                f = 
Arrays.stream(c2.getDeclaredFields()).filter(x -> 
x.getName().equals(name)).findFirst().orElse(null);
                                c2 = c2.getSuperclass();
@@ -230,7 +242,7 @@ public abstract class SimpleTestBase {
                                f.setAccessible(true);
                                return f.get(o);
                        }
-                       throw new RuntimeException("No field called " + name + 
" found on class "+c.getName()+"");
+                       throw runtimeException("No field called {0} found on 
class {1}", name, c.getName());
                });
        }
 
@@ -239,23 +251,6 @@ public abstract class SimpleTestBase {
                return ((("get"+n).equals(mn) || ("is"+n).equals(mn)) && 
m.getParameterCount() == 0);
        }
 
-       /**
-        * Returns true if this is a List or array.
-        */
-       private boolean isListOrArray(Object o) {
-               return o instanceof List || o.getClass().isArray();
-       }
-
-       /**
-        * Returns the length of a List or array.
-        */
-       private int length(Object o) {
-               if (o == null) return 0;
-               if (o instanceof List) return ((List<?>)o).size();
-               if (o.getClass().isArray()) return Array.getLength(o);
-               throw new RuntimeException("Invalid data type for 
length(Object): " + o.getClass().getSimpleName());
-       }
-
        /**
         * Creates an array of objects.
         */
@@ -263,4 +258,11 @@ public abstract class SimpleTestBase {
        protected static <T> T[] a(T...x) {
                return x;
        }
-}
+
+       /**
+        * Simplified string supplier with message arguments.
+        */
+       public static Supplier<String> ss(String pattern, Object...args) {
+               return ()->StringUtils.format(pattern, args);
+       }
+}
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanPropertiesTest.java
 
b/juneau-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanPropertiesTest.java
index 761d849b0..0dc5089bb 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanPropertiesTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripBeanPropertiesTest.java
@@ -50,7 +50,6 @@ public class RoundTripBeanPropertiesTest extends 
RoundTripTest {
                o.f1[0] = alist(123L);
                o = roundTrip(o);
                assertEquals(123, o.f1[0].get(0).intValue());
-               assertTrue(o.f1[0].get(0) instanceof Long);
        }
 
        public static class A02 {
@@ -63,7 +62,6 @@ public class RoundTripBeanPropertiesTest extends 
RoundTripTest {
                o.f1 = CollectionUtils.<Long[]>alist(new Long[]{123L});
                o = roundTrip(o);
                assertEquals(123, o.f1.get(0)[0].intValue());
-               assertTrue(o.f1.get(0)[0] instanceof Long);
        }
 
        public static class A03 {
@@ -77,7 +75,6 @@ public class RoundTripBeanPropertiesTest extends 
RoundTripTest {
                o.f1[0] = new List[]{alist(123L)};
                o = roundTrip(o);
                assertEquals(123, o.f1[0][0].get(0).intValue());
-               assertTrue(o.f1[0][0].get(0) instanceof Long);
        }
 
        public static class A04 {
@@ -90,6 +87,5 @@ public class RoundTripBeanPropertiesTest extends 
RoundTripTest {
                o.f1 = CollectionUtils.<Long[][]>alist(new Long[][]{new 
Long[]{123L}});
                o = roundTrip(o);
                assertEquals(123, o.f1.get(0)[0][0].intValue());
-               assertTrue(o.f1.get(0)[0][0] instanceof Long);
        }
 }
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/reflect/ClassInfoTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/reflect/ClassInfoTest.java
index 85366b035..b89320409 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/reflect/ClassInfoTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/reflect/ClassInfoTest.java
@@ -162,7 +162,7 @@ public class ClassInfoTest {
 
        @Test
        public void inner() {
-               assertTrue(of(A1.class).inner() instanceof Class);
+               assertNotNull(of(A1.class).inner());
                assertTrue(of(A1.class).innerType() instanceof Class);
        }
 
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/utils/CharSetTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/utils/AsciiSet_Test.java
similarity index 90%
rename from juneau-utest/src/test/java/org/apache/juneau/utils/CharSetTest.java
rename to juneau-utest/src/test/java/org/apache/juneau/utils/AsciiSet_Test.java
index 4d590ef19..f9622d971 100755
--- a/juneau-utest/src/test/java/org/apache/juneau/utils/CharSetTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/utils/AsciiSet_Test.java
@@ -13,24 +13,25 @@
 package org.apache.juneau.utils;
 
 import static org.junit.Assert.*;
-import static org.junit.runners.MethodSorters.*;
 
+import org.apache.juneau.*;
 import org.apache.juneau.common.internal.*;
 import org.junit.*;
 
-@FixMethodOrder(NAME_ASCENDING)
-public class CharSetTest {
+/**
+ * Tests {@link AsciiSet}.
+ */
+class AsciiSet_Test extends SimpleTestBase {
 
        
//====================================================================================================
        // test - Basic tests
        
//====================================================================================================
-       @Test
-       public void test() {
-               AsciiSet cs = AsciiSet.create("abc\u1234");
+       @Test void a01_basic() {
+               var cs = AsciiSet.of("abc\u1234");
                assertTrue(cs.contains('a'));
                assertFalse(cs.contains('d'));
                assertFalse(cs.contains('\u1234'));
                assertFalse(cs.contains((char)-1));
                assertFalse(cs.contains((char)128));
        }
-}
\ No newline at end of file
+}
\ No newline at end of file
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/utils/StringUtilsTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/utils/StringUtilsTest.java
index ccb218419..2b115f9d4 100755
--- a/juneau-utest/src/test/java/org/apache/juneau/utils/StringUtilsTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/utils/StringUtilsTest.java
@@ -12,30 +12,30 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.utils;
 
-import static org.apache.juneau.assertions.Assertions.*;
 import static org.apache.juneau.common.internal.StringUtils.*;
 import static org.apache.juneau.internal.CollectionUtils.*;
-import static org.junit.Assert.*;
-import static org.junit.runners.MethodSorters.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.util.*;
 
+import org.apache.juneau.*;
 import org.apache.juneau.collections.*;
 import org.apache.juneau.common.internal.*;
-import org.apache.juneau.json.*;
-import org.apache.juneau.serializer.*;
-import org.apache.juneau.utest.utils.Utils2;
-import org.junit.*;
+import org.apache.juneau.utest.utils.*;
+import org.junit.jupiter.api.*;
 
-@FixMethodOrder(NAME_ASCENDING)
-public class StringUtilsTest {
+class StringUtilsTest extends SimpleTestBase {
 
        
//====================================================================================================
        // isNumeric(String,Class)
        // parseNumber(String,Class)
        
//====================================================================================================
-       @Test
-       public void testParseNumber() {
+       @Test void a01_testParser() {
 
                // Integers
                assertTrue(isNumeric("123"));
@@ -140,9 +140,9 @@ public class StringUtilsTest {
                assertTrue(isNumeric("0x123e1"));
                assertEquals(0x123e1, parseNumber("0x123e1", null));
 
-               assertThrown(()->parseNumber("x", Number.class)).isExists();
-               assertThrown(()->parseNumber("x", null)).isExists();
-               assertThrown(()->parseNumber("x", 
BadNumber.class)).asMessage().isContains("Unsupported Number type");
+               assertThrows(NumberFormatException.class, ()->parseNumber("x", 
Number.class));
+               assertThrows(NumberFormatException.class, ()->parseNumber("x", 
null));
+               assertThrows(NumberFormatException.class, ()->parseNumber("x", 
BadNumber.class), "Unsupported Number type");
        }
 
        @SuppressWarnings("serial")
@@ -151,8 +151,7 @@ public class StringUtilsTest {
        
//====================================================================================================
        // test - Basic tests
        
//====================================================================================================
-       @Test
-       public void testNumberRanges() {
+       @Test void a02_numberRanges() {
                String s;
 
                // An integer range is -2,147,483,648 to 2,147,483,647
@@ -245,89 +244,52 @@ public class StringUtilsTest {
 
                s = String.valueOf("214748364x");
                assertFalse(isNumeric(s));
-               assertThrown(()->parseNumber(String.valueOf("214748364x"), 
Number.class)).isType(NumberFormatException.class);
+               assertThrows(NumberFormatException.class, 
()->parseNumber("214748364x", Number.class));
 
                s = String.valueOf("2147483640x");
                assertFalse(isNumeric(s));
-               assertThrown(()->parseNumber(String.valueOf("2147483640x"), 
Long.class)).isType(NumberFormatException.class);
+               assertThrows(NumberFormatException.class, 
()->parseNumber("2147483640x", Long.class));
        }
 
        
//====================================================================================================
        // testReplaceVars
        
//====================================================================================================
-       @Test
-       public void testReplaceVars() throws Exception {
-               JsonMap m = 
JsonMap.ofJson("{a:'A',b:1,c:true,d:'{e}',e:'E{f}E',f:'F',g:'{a}',h:'a',i:null}");
-
-               String s = "xxx";
-               assertEquals("xxx", replaceVars(s, m));
-
-               s = "{a}";
-               assertEquals("A", replaceVars(s, m));
-               s = "{a}{a}";
-               assertEquals("AA", replaceVars(s, m));
-               s = "x{a}x";
-               assertEquals("xAx", replaceVars(s, m));
-               s = "x{a}x{a}x";
-               assertEquals("xAxAx", replaceVars(s, m));
-
-               s = "{b}";
-               assertEquals("1", replaceVars(s, m));
-               s = "{b}{b}";
-               assertEquals("11", replaceVars(s, m));
-               s = "x{b}x";
-               assertEquals("x1x", replaceVars(s, m));
-               s = "x{b}x{b}x";
-               assertEquals("x1x1x", replaceVars(s, m));
-
-               s = "{c}";
-               assertEquals("true", replaceVars(s, m));
-               s = "{c}{c}";
-               assertEquals("truetrue", replaceVars(s, m));
-               s = "x{c}x{c}x";
-               assertEquals("xtruextruex", replaceVars(s, m));
-
-               s = "{d}";
-               assertEquals("EFE", replaceVars(s, m));
-               s = "{d}{d}";
-               assertEquals("EFEEFE", replaceVars(s, m));
-               s = "x{d}x";
-               assertEquals("xEFEx", replaceVars(s, m));
-               s = "x{d}x{d}x";
-               assertEquals("xEFExEFEx", replaceVars(s, m));
-
-               s = "{g}";
-               assertEquals("A", replaceVars(s, m));
-               s = "{g}{g}";
-               assertEquals("AA", replaceVars(s, m));
-               s = "x{g}x";
-               assertEquals("xAx", replaceVars(s, m));
-               s = "x{g}x{g}x";
-               assertEquals("xAxAx", replaceVars(s, m));
-
-               s = "{x}";
-               assertEquals("{x}", replaceVars(s, m));
-               s = "{x}{x}";
-               assertEquals("{x}{x}", replaceVars(s, m));
-               s = "x{x}x{x}x";
-               assertEquals("x{x}x{x}x", replaceVars(s, m));
-
-               s = "{{g}}";
-               assertEquals("{A}", replaceVars(s, m));
-               s = "{{h}}";
-               assertEquals("A", replaceVars(s, m));
-
-               s = "{{i}}";
-               assertEquals("{}", replaceVars(s, m));
-               s = "{}";
-               assertEquals("{}", replaceVars(s, m));
+       @Test void a03_replaceVars() throws Exception {
+               var m = 
JsonMap.ofJson("{a:'A',b:1,c:true,d:'{e}',e:'E{f}E',f:'F',g:'{a}',h:'a',i:null}");
+
+               assertEquals("xxx", replaceVars("xxx", m));
+               assertEquals("A", replaceVars("{a}", m));
+               assertEquals("AA", replaceVars("{a}{a}", m));
+               assertEquals("xAx", replaceVars("x{a}x", m));
+               assertEquals("xAxAx", replaceVars("x{a}x{a}x", m));
+               assertEquals("1", replaceVars("{b}", m));
+               assertEquals("11", replaceVars("{b}{b}", m));
+               assertEquals("x1x", replaceVars("x{b}x", m));
+               assertEquals("x1x1x", replaceVars("x{b}x{b}x", m));
+               assertEquals("true", replaceVars("{c}", m));
+               assertEquals("truetrue", replaceVars("{c}{c}", m));
+               assertEquals("xtruextruex", replaceVars("x{c}x{c}x", m));
+               assertEquals("EFE", replaceVars("{d}", m));
+               assertEquals("EFEEFE", replaceVars("{d}{d}", m));
+               assertEquals("xEFEx", replaceVars("x{d}x", m));
+               assertEquals("xEFExEFEx", replaceVars("x{d}x{d}x", m));
+               assertEquals("A", replaceVars("{g}", m));
+               assertEquals("AA", replaceVars("{g}{g}", m));
+               assertEquals("xAx", replaceVars("x{g}x", m));
+               assertEquals("xAxAx", replaceVars("x{g}x{g}x", m));
+               assertEquals("{x}", replaceVars("{x}", m));
+               assertEquals("{x}{x}", replaceVars("{x}{x}", m));
+               assertEquals("x{x}x{x}x", replaceVars("x{x}x{x}x", m));
+               assertEquals("{A}", replaceVars("{{g}}", m));
+               assertEquals("A", replaceVars("{{h}}", m));
+               assertEquals("{}", replaceVars("{{i}}", m));
+               assertEquals("{}", replaceVars("{}", m));
        }
 
        
//====================================================================================================
        // isFloat(String)
        
//====================================================================================================
-       @Test
-       public void testisFloat() {
+       @Test void a04_isFloat() {
                String[] valid = {
                        "+1.0",
                        "-1.0",
@@ -346,10 +308,10 @@ public class StringUtilsTest {
                        "0x1.fffffffffffffp1023",
                        "0x1.FFFFFFFFFFFFFP1023",
                };
-               for (String s : valid)
+               for (var s : valid)
                        assertTrue(isFloat(s));
 
-               String[] invalid = {
+               var invalid = new String[] {
                        null,
                        "",
                        "a",
@@ -360,16 +322,15 @@ public class StringUtilsTest {
                        "+a",
                        "11a",
                };
-               for (String s : invalid)
+               for (var s : invalid)
                        assertFalse(isFloat(s));
        }
 
        
//====================================================================================================
        // isDecimal(String)
        
//====================================================================================================
-       @Test
-       public void testisDecimal() {
-               String[] valid = {
+       @Test void a05_isDecimal() {
+               var valid = new String[] {
                        "+1",
                        "-1",
                        "0x123",
@@ -380,10 +341,10 @@ public class StringUtilsTest {
                        "#DEF",
                        "0123",
                };
-               for (String s : valid)
+               for (var s : valid)
                        assertTrue(isDecimal(s));
 
-               String[] invalid = {
+               var invalid = new String[] {
                        null,
                        "",
                        "a",
@@ -397,7 +358,7 @@ public class StringUtilsTest {
                        "0128",
                        "012A",
                };
-               for (String s : invalid)
+               for (var s : invalid)
                        assertFalse(isDecimal(s));
        }
 
@@ -409,8 +370,7 @@ public class StringUtilsTest {
        // join(int[],char)
        // join(Collection,char)
        
//====================================================================================================
-       @Test
-       public void testJoin() {
+       @Test void a01_join() {
                assertNull(join((Object[])null, ","));
                assertEquals("1", join(new Object[]{1}, ","));
                assertEquals("1,2", join(new Object[]{1,2}, ","));
@@ -437,122 +397,57 @@ public class StringUtilsTest {
        
//====================================================================================================
        // split(String,char)
        
//====================================================================================================
-       @Test
-       public void testSplit() {
-               String[] r;
-
+       @Test void a07_split() {
                assertNull(split((String)null));
-               assertObject(split("")).asJson().is("[]");
-               assertObject(split("1")).asJson().is("['1']");
-               assertObject(split("1,2")).asJson().is("['1','2']");
-               assertObject(split("1\\,2")).asJson().is("['1,2']");
-
-               r = split("1\\\\,2");
-               assertEquals("1\\", r[0]);
-               assertEquals("2", r[1]);
-
-               r = split("1\\\\\\,2");
-               assertEquals(1, r.length);
-               assertEquals("1\\,2", r[0]);
-
-               r = split("1,2\\");
-               assertEquals("2\\", r[1]);
-
-               r = split("1,2\\\\");
-               assertEquals("2\\", r[1]);
-
-               r = split("1,2\\,");
-               assertEquals("2,", r[1]);
-
-               r = split("1,2\\\\,");
-               assertEquals("2\\", r[1]);
-               assertEquals("", r[2]);
-       }
-
-       @Test
-       public void testSplit2() {
-               List<String> l1 = list();
-               split((String)null, l1::add);
-               assertList(l1).isEmpty();
-
-               List<String> l2 = list();
-               split("", l2::add);
-               assertObject(l2).asJson().is("[]");
-
-               List<String> l3 = list();
-               split("1", l3::add);
-               assertObject(l3).asJson().is("['1']");
-
-               List<String> l4 = list();
-               split("1,2", l4::add);
-               assertObject(l4).asJson().is("['1','2']");
-
-               List<String> l5 = list();
-               split("1\\,2", l5::add);
-               assertObject(l5).asJson().is("['1,2']");
-
-               List<String> l6 = list();
-               split("1\\\\,2", l6::add);
-               assertEquals("1\\", l6.get(0));
-               assertEquals("2", l6.get(1));
-
-               List<String> l7 = list();
-               split("1\\\\\\,2", l7::add);
-               assertEquals(1, l7.size());
-               assertEquals("1\\,2", l7.get(0));
-
-               List<String> l8 = list();
-               split("1,2\\", l8::add);
-               assertEquals("2\\", l8.get(1));
-
-               List<String> l9 = list();
-               split("1,2\\\\", l9::add);
-               assertEquals("2\\", l9.get(1));
-
-               List<String> l10 = list();
-               split("1,2\\,", l10::add);
-               assertEquals("2,", l10.get(1));
-
-               List<String> l11 = list();
-               split("1,2\\\\,", l11::add);
-               assertEquals("2\\", l11.get(1));
-               assertEquals("", l11.get(2));
+               assertArray(split(""));
+               assertArray(split("1"), "1");
+               assertArray(split("1,2"), "1", "2");
+               assertArray(split("1\\,2"), "1,2");
+               assertArray(split("1\\\\,2"), "1\\", "2");
+               assertArray(split("1\\\\\\,2"), "1\\,2");
+               assertArray(split("1,2\\"), "1", "2\\");
+               assertArray(split("1,2\\\\"), "1", "2\\");
+               assertArray(split("1,2\\,"), "1", "2,");
+               assertArray(split("1,2\\\\,"), "1", "2\\", "");
+       }
+
+       @Test void a08_split2() {
+               assertEmpty(split2test(null));
+               assertString("[]", split2test(""));
+               assertString("[1]", split2test("1"));
+               assertString("[1,2]", split2test("1,2"));
+               assertList(split2test("1\\,2"), "1,2");
+               assertList(split2test("1\\\\,2"), "1\\", "2");
+               assertList(split2test("1\\\\\\,2"), "1\\,2");
+               assertList(split2test("1,2\\"), "1", "2\\");
+               assertList(split2test("1,2\\\\"), "1", "2\\");
+               assertList(split2test("1,2\\,"), "1", "2,");
+               assertList(split2test("1,2\\\\,"), "1", "2\\", "");
+       }
+
+       private List<String> split2test(String s) {
+               List<String> l = list();
+               split(s, l::add);
+               return l;
        }
 
        
//====================================================================================================
        // split(String,char,int)
        
//====================================================================================================
-       @Test
-       public void testSplitWithLimit() {
-               String[] r;
-
-               r = split("boo:and:foo", ':', 10);
-               assertObject(r).asJson().is("['boo','and','foo']");
-
-               r = split("boo:and:foo", ':', 2);
-               assertObject(r).asJson().is("['boo','and:foo']");
-
-               r = split("boo:and:foo", ':', 1);
-               assertObject(r).asJson().is("['boo:and:foo']");
-
-               r = split("boo:and:foo", ':', 0);
-               assertObject(r).asJson().is("['boo:and:foo']");
-
-               r = split("boo:and:foo", ':', -1);
-               assertObject(r).asJson().is("['boo:and:foo']");
-
-               r = split("boo : and : foo", ':', 10);
-               assertObject(r).asJson().is("['boo','and','foo']");
-
-               r = split("boo : and : foo", ':', 2);
-               assertObject(r).asJson().is("['boo','and : foo']");
+       @Test void a09_splitWithLimit() {
+               assertString("[boo,and,foo]", split("boo:and:foo", ':', 10));
+               assertString("[boo,and:foo]", split("boo:and:foo", ':', 2));
+               assertString("[boo:and:foo]", split("boo:and:foo", ':', 1));
+               assertString("[boo:and:foo]", split("boo:and:foo", ':', 0));
+               assertString("[boo:and:foo]", split("boo:and:foo", ':', -1));
+               assertString("[boo,and,foo]", split("boo : and : foo", ':', 
10));
+               assertString("[boo,and : foo]", split("boo : and : foo", ':', 
2));
        }
 
        
//====================================================================================================
        // nullIfEmpty(String)
        
//====================================================================================================
-       @Test
-       public void testNullIfEmpty() {
+       @Test void a10_nullIfEmpty() {
                assertNull(nullIfEmpty(null));
                assertNull(nullIfEmpty(""));
                assertNotNull(nullIfEmpty("x"));
@@ -561,9 +456,8 @@ public class StringUtilsTest {
        
//====================================================================================================
        // unescapeChars(String,char[],char)
        
//====================================================================================================
-       @Test
-       public void testUnescapeChars() {
-               AsciiSet escape = AsciiSet.create("\\,|");
+       @Test void a11_unescapeChars() {
+               var escape = AsciiSet.of("\\,|");
 
                assertNull(unEscapeChars(null, escape));
                assertEquals("xxx", unEscapeChars("xxx", escape));
@@ -577,15 +471,14 @@ public class StringUtilsTest {
                assertEquals(",", unEscapeChars("\\,", escape));
                assertEquals("|", unEscapeChars("\\|", escape));
 
-               escape = AsciiSet.create(",|");
+               escape = AsciiSet.of(",|");
                assertEquals("x\\\\xx", unEscapeChars("x\\\\xx", escape));
        }
 
        
//====================================================================================================
        // decodeHex(String)
        
//====================================================================================================
-       @Test
-       public void testDecodeHex() {
+       @Test void a12_decodeHex() {
                assertNull(decodeHex(null));
                assertEquals("19azAZ", decodeHex("19azAZ"));
                assertEquals("[0][1][ffff]", decodeHex("\u0000\u0001\uFFFF"));
@@ -594,8 +487,7 @@ public class StringUtilsTest {
        
//====================================================================================================
        // startsWith(String,char)
        
//====================================================================================================
-       @Test
-       public void testStartsWith() {
+       @Test void a13_startsWith() {
                assertFalse(startsWith(null, 'a'));
                assertFalse(startsWith("", 'a'));
                assertTrue(startsWith("a", 'a'));
@@ -605,8 +497,7 @@ public class StringUtilsTest {
        
//====================================================================================================
        // endsWith(String,char)
        
//====================================================================================================
-       @Test
-       public void testEndsWith() {
+       @Test void a14_endsWith() {
                assertFalse(endsWith(null, 'a'));
                assertFalse(endsWith("", 'a'));
                assertTrue(endsWith("a", 'a'));
@@ -617,31 +508,23 @@ public class StringUtilsTest {
        // base64EncodeToString(String)
        // base64DecodeToString(String)
        
//====================================================================================================
-       @Test
-       public void testBase64EncodeToString() {
-               String s = null;
-
-               assertEquals(s, base64DecodeToString(base64EncodeToString(s)));
-               s = "";
-               assertEquals(s, base64DecodeToString(base64EncodeToString(s)));
-               s = "foobar";
-               assertEquals(s, base64DecodeToString(base64EncodeToString(s)));
-               s = "\u0000\uffff";
-               assertEquals(s, base64DecodeToString(base64EncodeToString(s)));
-
-               assertThrown(()->base64Decode("a")).asMessage().is("Invalid 
BASE64 string length.  Must be multiple of 4.");
-               
assertThrown(()->base64Decode("aaa")).isType(IllegalArgumentException.class);
+       @Test void a15_base64EncodeToString() {
+               assertNull(base64DecodeToString(base64EncodeToString(null)));
+               assertEquals("", 
base64DecodeToString(base64EncodeToString("")));
+               assertEquals("foobar", 
base64DecodeToString(base64EncodeToString("foobar")));
+               assertEquals("\u0000\uffff", 
base64DecodeToString(base64EncodeToString("\u0000\uffff")));
+               assertThrows(IllegalArgumentException.class, 
()->base64Decode("a"), "Invalid BASE64 string length.  Must be multiple of 4.");
+               assertThrows(IllegalArgumentException.class, 
()->base64Decode("aaa"));
        }
 
        
//====================================================================================================
        // generateUUID(String)
        
//====================================================================================================
-       @Test
-       public void testGenerateUUID() {
-               for (int i = 0; i < 10; i++) {
-                       String s = random(i);
+       @Test void a16_generateUUID() {
+               for (var i = 0; i < 10; i++) {
+                       var s = random(i);
                        assertEquals(i, s.length());
-                       for (char c : s.toCharArray())
+                       for (var c : s.toCharArray())
                                assertTrue(Character.isLowerCase(c) || 
Character.isDigit(c));
                }
        }
@@ -649,8 +532,7 @@ public class StringUtilsTest {
        
//====================================================================================================
        // trim(String)
        
//====================================================================================================
-       @Test
-       public void testTrim() {
+       @Test void a17_trim() {
                assertNull(trim(null));
                assertEquals("", trim(""));
                assertEquals("", trim("  "));
@@ -659,27 +541,22 @@ public class StringUtilsTest {
        
//====================================================================================================
        // parseISO8601Date(String)
        
//====================================================================================================
-       @Test
-       public void testParseISO8601Date() throws Exception {
-               WriterSerializer s = JsonSerializer.create().json5().build();
-
+       @Test void a18_parseISO8601Date() throws Exception {
                assertNull(parseIsoDate(null));
                assertNull(parseIsoDate(""));
 
                Utils2.setTimeZone("GMT");
                try {
-                       assertEquals("'2000-01-01T00:00:00'", 
s.serialize(parseIsoDate("2000")));
-                       assertEquals("'2000-02-01T00:00:00'", 
s.serialize(parseIsoDate("2000-02")));
-                       assertEquals("'2000-02-03T00:00:00'", 
s.serialize(parseIsoDate("2000-02-03")));
-                       assertEquals("'2000-02-03T04:00:00'", 
s.serialize(parseIsoDate("2000-02-03T04")));
-                       assertEquals("'2000-02-03T04:05:00'", 
s.serialize(parseIsoDate("2000-02-03T04:05")));
-                       assertEquals("'2000-02-03T04:05:06'", 
s.serialize(parseIsoDate("2000-02-03T04:05:06")));
-                       assertEquals("'2000-02-03T04:00:00'", 
s.serialize(parseIsoDate("2000-02-03 04")));
-                       assertEquals("'2000-02-03T04:05:00'", 
s.serialize(parseIsoDate("2000-02-03 04:05")));
-                       assertEquals("'2000-02-03T04:05:06'", 
s.serialize(parseIsoDate("2000-02-03 04:05:06")));
-
-                       // ISO8601 doesn't support milliseconds, so it gets 
trimmed.
-                       assertEquals("'2000-02-03T04:05:06'", 
s.serialize(parseIsoDate("2000-02-03 04:05:06,789")));
+                       assertString("2000-01-01T00:00:00Z", 
parseIsoDate("2000"));
+                       assertString("2000-02-01T00:00:00Z", 
parseIsoDate("2000-02"));
+                       assertString("2000-02-03T00:00:00Z", 
parseIsoDate("2000-02-03"));
+                       assertString("2000-02-03T04:00:00Z", 
parseIsoDate("2000-02-03T04"));
+                       assertString("2000-02-03T04:05:00Z", 
parseIsoDate("2000-02-03T04:05"));
+                       assertString("2000-02-03T04:05:06Z", 
parseIsoDate("2000-02-03T04:05:06"));
+                       assertString("2000-02-03T04:00:00Z", 
parseIsoDate("2000-02-03 04"));
+                       assertString("2000-02-03T04:05:00Z", 
parseIsoDate("2000-02-03 04:05"));
+                       assertString("2000-02-03T04:05:06Z", 
parseIsoDate("2000-02-03 04:05:06"));
+                       assertString("2000-02-03T04:05:06Z", 
parseIsoDate("2000-02-03 04:05:06,789"));// ISO8601 doesn't support 
milliseconds, so it gets trimmed.
                } finally {
                        Utils2.unsetTimeZone();
                }
@@ -688,25 +565,23 @@ public class StringUtilsTest {
        
//====================================================================================================
        // parseMap(String,char,char,boolean)
        
//====================================================================================================
-       @Test
-       public void testSplitMap() {
-               assertObject(splitMap("a=1", true)).asJson().is("{a:'1'}");
-               assertObject(splitMap("a=1,b=2", 
true)).asJson().is("{a:'1',b:'2'}");
-               assertObject(splitMap(" a = 1 , b = 2 ", 
true)).asJson().is("{a:'1',b:'2'}");
-               assertObject(splitMap(" a = 1 , b = 2 ", 
false)).asJson().is("{' a ':' 1 ',' b ':' 2 '}");
-               assertObject(splitMap("a", true)).asJson().is("{a:''}");
-               assertObject(splitMap("a,b", true)).asJson().is("{a:'',b:''}");
-               assertObject(splitMap("a=1,b", 
true)).asJson().is("{a:'1',b:''}");
-               assertObject(splitMap("a,b=1", 
true)).asJson().is("{a:'',b:'1'}");
-               assertObject(splitMap("a\\==1", 
true)).asJson().is("{'a=':'1'}");
-               assertObject(splitMap("a\\\\=1", 
true)).asJson().is("{'a\\\\':'1'}");
+       @Test void a19_splitMap() {
+               assertString("{a=1}", splitMap("a=1", true));
+               assertString("{a=1,b=2}", splitMap("a=1,b=2", true));
+               assertString("{a=1,b=2}", splitMap(" a = 1 , b = 2 ", true));
+               assertString("{ a = 1 , b = 2 }", splitMap(" a = 1 , b = 2 ", 
false));
+               assertString("{a=}", splitMap("a", true));
+               assertString("{a=,b=}", splitMap("a,b", true));
+               assertString("{a=1,b=}", splitMap("a=1,b", true));
+               assertString("{a=,b=1}", splitMap("a,b=1", true));
+               assertString("{a==1}", splitMap("a\\==1", true));
+               assertString("{a\\=1}", splitMap("a\\\\=1", true));
        }
 
        
//====================================================================================================
        // isAbsoluteUri(String)
        
//====================================================================================================
-       @Test
-       public void testIsAbsoluteUri() {
+       @Test void a10_isAbsoluteUri() {
                assertFalse(isAbsoluteUri(null));
                assertFalse(isAbsoluteUri(""));
                assertTrue(isAbsoluteUri("http://foo";));
@@ -722,8 +597,7 @@ public class StringUtilsTest {
        
//====================================================================================================
        // getAuthorityUri(String)
        
//====================================================================================================
-       @Test
-       public void testGetAuthorityUri() {
+       @Test void a21_getAuthorityUri() {
                assertEquals("http://foo";, getAuthorityUri("http://foo";));
                assertEquals("http://foo:123";, 
getAuthorityUri("http://foo:123";));
                assertEquals("http://foo:123";, 
getAuthorityUri("http://foo:123/";));
@@ -733,34 +607,32 @@ public class StringUtilsTest {
        
//====================================================================================================
        // splitQuoted(String)
        
//====================================================================================================
-       @Test
-       public void getSplitQuoted() {
-               assertObject(splitQuoted(null)).asJson().is("null");
-               assertObject(splitQuoted("")).asJson().is("[]");
-               assertObject(splitQuoted(" \t ")).asJson().is("[]");
-               assertObject(splitQuoted("foo")).asJson().is("['foo']");
-               assertObject(splitQuoted("foo  bar 
baz")).asJson().is("['foo','bar','baz']");
-               assertObject(splitQuoted("'foo'")).asJson().is("['foo']");
-               assertObject(splitQuoted(" ' foo ' ")).asJson().is("[' foo ']");
-               assertObject(splitQuoted("'foo' 
'bar'")).asJson().is("['foo','bar']");
-               assertObject(splitQuoted("\"foo\"")).asJson().is("['foo']");
-               assertObject(splitQuoted(" \" foo \" ")).asJson().is("[' foo 
']");
-               assertObject(splitQuoted("\"foo\" 
\"bar\"")).asJson().is("['foo','bar']");
-               
assertObject(splitQuoted("'foo\\'bar'")).asJson().is("['foo\\'bar']");
-               
assertObject(splitQuoted("'foo\\\"bar'")).asJson().is("['foo\"bar']");
-               
assertObject(splitQuoted("'\\'foo\\'bar\\''")).asJson().is("['\\'foo\\'bar\\'']");
-               
assertObject(splitQuoted("'\\\"foo\\\"bar\\\"'")).asJson().is("['\"foo\"bar\"']");
-               
assertObject(splitQuoted("'\\'foo\\''")).asJson().is("['\\'foo\\'']");
-               
assertObject(splitQuoted("\"\\\"foo\\\"\"")).asJson().is("['\"foo\"']");
-               
assertObject(splitQuoted("'\"foo\"'")).asJson().is("['\"foo\"']");
-               
assertObject(splitQuoted("\"'foo'\"")).asJson().is("['\\'foo\\'']");
+       @Test void a22_splitQuoted() {
+               assertNull(splitQuoted(null));
+               assertArray(splitQuoted(""));
+               assertArray(splitQuoted(" \t "));
+               assertArray(splitQuoted("foo"), "foo");
+               assertArray(splitQuoted("foo  bar baz"), "foo", "bar", "baz");
+               assertArray(splitQuoted("'foo'"), "foo");
+               assertArray(splitQuoted(" ' foo ' "), " foo ");
+               assertArray(splitQuoted("'foo' 'bar'"), "foo", "bar");
+               assertArray(splitQuoted("\"foo\""), "foo");
+               assertArray(splitQuoted(" \" foo \" "), " foo ");
+               assertArray(splitQuoted("\"foo\" \"bar\""), "foo", "bar");
+               assertArray(splitQuoted("'foo\\'bar'"), "foo'bar");
+               assertArray(splitQuoted("'foo\\\"bar'"), "foo\"bar");
+               assertArray(splitQuoted("'\\'foo\\'bar\\''"), "'foo'bar'");
+               assertArray(splitQuoted("'\\\"foo\\\"bar\\\"'"), 
"\"foo\"bar\"");
+               assertArray(splitQuoted("'\\'foo\\''"), "'foo'");
+               assertArray(splitQuoted("\"\\\"foo\\\"\""), "\"foo\"");
+               assertArray(splitQuoted("'\"foo\"'"), "\"foo\"");
+               assertArray(splitQuoted("\"'foo'\""), "'foo'");
        }
 
        
//====================================================================================================
        // firstNonWhitespaceChar(String)
        
//====================================================================================================
-       @Test
-       public void testFirstNonWhitespaceChar() {
+       @Test void a23_firstNonWhitespaceChar() {
                assertEquals('f', firstNonWhitespaceChar("foo"));
                assertEquals('f', firstNonWhitespaceChar(" foo"));
                assertEquals('f', firstNonWhitespaceChar("\tfoo"));
@@ -773,8 +645,7 @@ public class StringUtilsTest {
        
//====================================================================================================
        // lastNonWhitespaceChar(String)
        
//====================================================================================================
-       @Test
-       public void testLastNonWhitespaceChar() {
+       @Test void a24_lastNonWhitespaceChar() {
                assertEquals('r', lastNonWhitespaceChar("bar"));
                assertEquals('r', lastNonWhitespaceChar(" bar "));
                assertEquals('r', lastNonWhitespaceChar("\tbar\t"));
@@ -787,8 +658,7 @@ public class StringUtilsTest {
        
//====================================================================================================
        // testIsJsonObject(Object)
        
//====================================================================================================
-       @Test
-       public void testIsJsonObject() {
+       @Test void a25_isJsonObject() {
                assertTrue(isJsonObject("{foo:'bar'}", true));
                assertTrue(isJsonObject(" { foo:'bar' } ", true));
                assertFalse(isJsonObject(" { foo:'bar'  ", true));
@@ -799,8 +669,7 @@ public class StringUtilsTest {
        
//====================================================================================================
        // isJsonArray(Object)
        
//====================================================================================================
-       @Test
-       public void testIsJsonArray() {
+       @Test void a26_isJsonArray() {
                assertTrue(isJsonArray("[123,'bar']", true));
                assertTrue(isJsonArray(" [ 123,'bar' ] ", true));
                assertFalse(isJsonArray(" [ 123,'bar'  ", true));
@@ -811,8 +680,7 @@ public class StringUtilsTest {
        
//====================================================================================================
        // addLineNumbers(String)
        
//====================================================================================================
-       @Test
-       public void testAddLineNumbers() {
+       @Test void a27_addLineNumbers() {
                assertNull(getNumberedLines(null));
                assertEquals("1: \n", getNumberedLines(""));
                assertEquals("1: foo\n", getNumberedLines("foo"));
@@ -822,8 +690,7 @@ public class StringUtilsTest {
        
//====================================================================================================
        // compare(String,String)
        
//====================================================================================================
-       @Test
-       public void testCompare() {
+       @Test void a28_compare() {
                assertTrue(compare("a","b") < 0);
                assertTrue(compare("b","a") > 0);
                assertTrue(compare(null,"b") < 0);
@@ -834,8 +701,7 @@ public class StringUtilsTest {
        
//====================================================================================================
        // matchPattern(String)
        
//====================================================================================================
-       @Test
-       public void testGetMatchPattern() {
+       @Test void a29_getMatchPattern() {
                assertTrue(getMatchPattern("a").matcher("a").matches());
                assertTrue(getMatchPattern("*a*").matcher("aaa").matches());
                assertFalse(getMatchPattern("*b*").matcher("aaa").matches());
@@ -844,8 +710,7 @@ public class StringUtilsTest {
        
//====================================================================================================
        // getDuration(String)
        
//====================================================================================================
-       @Test
-       public void testGetDuration() {
+       @Test void a30_getDuration() {
                assertEquals(-1, getDuration(null));
                assertEquals(-1, getDuration(""));
                assertEquals(-1, getDuration(" "));
@@ -929,8 +794,7 @@ public class StringUtilsTest {
        
//====================================================================================================
        // getDuration(String)
        
//====================================================================================================
-       @Test
-       public void testStripInvalidHttpHeaderChars() {
+       @Test void a31_stripInvalidHttpHeaderChars() {
                assertEquals("xxx", stripInvalidHttpHeaderChars("xxx"));
                assertEquals("\t []^x", 
stripInvalidHttpHeaderChars("\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u0020\\[]^x"));
        }
@@ -938,8 +802,7 @@ public class StringUtilsTest {
        
//====================================================================================================
        // abbreviate(String,int)
        
//====================================================================================================
-       @Test
-       public void testAbbrevate() {
+       @Test void a32_abbrevate() {
                assertNull("xxx", abbreviate(null, 0));
                assertEquals("foo", abbreviate("foo", 3));
                assertEquals("...", abbreviate("fooo", 3));
@@ -950,20 +813,18 @@ public class StringUtilsTest {
        
//====================================================================================================
        // splitMethodArgs(String)
        
//====================================================================================================
-       @Test
-       public void testSplitMethodArgs() {
-               
assertObject(splitMethodArgs("java.lang.String")).asJson().is("['java.lang.String']");
-               
assertObject(splitMethodArgs("java.lang.String,java.lang.Integer")).asJson().is("['java.lang.String','java.lang.Integer']");
-               assertObject(splitMethodArgs("x,y")).asJson().is("['x','y']");
-               
assertObject(splitMethodArgs("x,y<a,b>,z")).asJson().is("['x','y<a,b>','z']");
-               
assertObject(splitMethodArgs("x,y<a<b,c>,d<e,f>>,z")).asJson().is("['x','y<a<b,c>,d<e,f>>','z']");
+       @Test void a33_splitMethodArgs() {
+               assertArray(splitMethodArgs("java.lang.String"), 
"java.lang.String");
+               
assertArray(splitMethodArgs("java.lang.String,java.lang.Integer"), 
"java.lang.String", "java.lang.Integer");
+               assertArray(splitMethodArgs("x,y"), "x","y");
+               assertArray(splitMethodArgs("x,y<a,b>,z"), "x", "y<a,b>", "z");
+               assertArray(splitMethodArgs("x,y<a<b,c>,d<e,f>>,z"), "x", 
"y<a<b,c>,d<e,f>>", "z");
        }
 
        
//====================================================================================================
        // fixUrl(String)
        
//====================================================================================================
-       @Test
-       public void testFixUrl() {
+       @Test void a34_fixUrl() {
                assertEquals(null, fixUrl(null));
                assertEquals("", fixUrl(""));
                assertEquals("xxx", fixUrl("xxx"));
@@ -976,8 +837,7 @@ public class StringUtilsTest {
        
//====================================================================================================
        // diffPosition(String,String)
        
//====================================================================================================
-       @Test
-       public void testDiffPosition() {
+       @Test void a35_diffPosition() {
                assertEquals(-1, diffPosition("a", "a"));
                assertEquals(-1, diffPosition(null, null));
                assertEquals(0, diffPosition("a", "b"));
@@ -991,8 +851,7 @@ public class StringUtilsTest {
        
//====================================================================================================
        // diffPositionIc(String,String)
        
//====================================================================================================
-       @Test
-       public void testDiffPositionIc() {
+       @Test void a36_diffPositionIc() {
                assertEquals(-1, diffPositionIc("a", "a"));
                assertEquals(-1, diffPositionIc("a", "A"));
                assertEquals(-1, diffPositionIc(null, null));
@@ -1003,4 +862,32 @@ public class StringUtilsTest {
                assertEquals(0, diffPositionIc("a", null));
                assertEquals(0, diffPositionIc(null, "b"));
        }
-}
\ No newline at end of file
+
+       
//====================================================================================================
+       // splitNested(String)
+       
//====================================================================================================
+       @Test void a37_splitNested() {
+               assertNull(splitNested(null));
+               assertList(splitNested(""));
+               assertList(splitNested("a"), "a");
+               assertList(splitNested("a,b,c"), "a", "b", "c");
+               assertList(splitNested("a{b,c},d"), "a{b,c}", "d");
+               assertList(splitNested("a,b{c,d}"), "a", "b{c,d}");
+               assertList(splitNested("a,b{c,d{e,f}}"), "a", "b{c,d{e,f}}");
+               assertList(splitNested("a { b , c } , d "), "a { b , c }", "d");
+               assertList(splitNested("a\\,b"), "a,b");
+               assertList(splitNested("a\\\\,b"), "a\\", "b");
+       }
+
+       
//====================================================================================================
+       // splitNestedInner(String)
+       
//====================================================================================================
+       @Test void a38_splitNestedInner() {
+               assertThrows(IllegalArgumentException.class, 
()->splitNestedInner(null), "String was null.");
+               assertThrows(IllegalArgumentException.class, 
()->splitNestedInner(""), "String was empty.");
+               assertList(splitNestedInner("a{b}"), "b");
+               assertList(splitNestedInner(" a { b } "), "b");
+               assertList(splitNestedInner("a{b,c}"), "b", "c");
+               assertList(splitNestedInner("a{b{c,d},e{f,g}}"), "b{c,d}", 
"e{f,g}");
+       }
+}
\ No newline at end of file

Reply via email to