View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.juneau.assertions;
18  
19  import static org.apache.juneau.TestUtils.*;
20  import static org.apache.juneau.assertions.AssertionPredicates.contains;
21  import static org.apache.juneau.assertions.AssertionPredicates.ne;
22  import static org.apache.juneau.assertions.Assertions.*;
23  import java.time.*;
24  import java.util.*;
25  
26  import org.apache.juneau.*;
27  import org.apache.juneau.json.*;
28  import org.junit.jupiter.api.*;
29  
30  @Deprecated
31  class AnyAssertion_Test extends TestBase {
32  
33  	//------------------------------------------------------------------------------------------------------------------
34  	// Helpers
35  	//------------------------------------------------------------------------------------------------------------------
36  
37  	private <T> AnyAssertion<T> test(T value) {
38  		return assertAny(value).setSilent();
39  	}
40  
41  	private static ZonedDateTime zdt(String s) {
42  		return ZonedDateTime.parse(s);
43  	}
44  
45  	private static Date date(String s) {
46  		return new Date(ZonedDateTime.parse(s).toEpochSecond()*1000);
47  	}
48  
49  	public static final A1 A1 = new A1();
50  	public static class A1 {
51  		public int a = 1, b = 2;
52  		@Override public String toString() { return "a="+a+",b="+b; }
53  	}
54  
55  	public static class A2 {
56  		public int getFoo() { throw new RuntimeException("foo"); }
57  	}
58  
59  	//-----------------------------------------------------------------------------------------------------------------
60  	// Basic tests
61  	//-----------------------------------------------------------------------------------------------------------------
62  
63  	@Test void a01_msg() {
64  		assertThrowsWithMessage(BasicAssertionError.class, "Foo 1", ()->test(null).setMsg("Foo {0}", 1).isExists());
65  		assertThrowsWithMessage(RuntimeException.class, "Foo 1", ()->test(null).setMsg("Foo {0}", 1).setThrowable(RuntimeException.class).isExists());
66  	}
67  
68  	@Test void a02_stdout() {
69  		test(null).setStdOut();
70  	}
71  
72  	//-----------------------------------------------------------------------------------------------------------------
73  	// Transform tests
74  	//-----------------------------------------------------------------------------------------------------------------
75  
76  	@Test void ba01a_asString() {
77  		var x = 1;
78  		var nil = n(Integer.class);
79  		test(x).asString().is("1");
80  		test(nil).asString().isNull();
81  	}
82  
83  	@Test void ba01b_asString_wSerializer() {
84  		var x = 1;
85  		var nil = n(Integer.class);
86  		var s = Json5Serializer.DEFAULT;
87  		test(x).asString(s).is("1");
88  		test(nil).asString(s).is("null");
89  	}
90  
91  	@Test void ba01c_asString_wPredicate() {
92  		var x1 = 1;
93  		test(x1).asString(x -> "foo").is("foo");
94  	}
95  
96  	@Test void ba02_asJson() {
97  		var x = 1;
98  		var nil = n(Integer.class);
99  		test(x).asJson().is("1");
100 		test(nil).asJson().is("null");
101 		assertThrown(()->test(new A2()).asJson()).asMessages().isAny(contains("Could not call getValue() on property 'foo'"));
102 	}
103 
104 	@Test void ba03_asJsonSorted() {
105 		var x1 = a(2,1);
106 		var nil = na(Integer.class);
107 		var x2 = new A1();
108 		test(x1).asJsonSorted().is("[1,2]");
109 		test(x2).asJsonSorted().is("{a:1,b:2}");
110 		test(nil).asJsonSorted().is("null");
111 	}
112 
113 	@Test void ba04_apply() {
114 		var x1 = 1;
115 		var x2 = 2;
116 		test(x1).asTransformed(x -> x2).is(x2);
117 	}
118 
119 	@Test void bb01_asArray() {
120 		var x1 = a(1,2);
121 		var nil = na(Integer.class);
122 		String x2 = "";
123 		test(x1).asArray(Integer.class).asItem(0).is(1);
124 		test(nil).asArray(Integer.class).isNull();
125 		assertThrown(()->test(x2).asArray(Integer.class)).asMessage().asOneLine().is("Object was not type 'java.lang.Integer[]'.  Actual='java.lang.String'.");
126 		assertThrown(()->test(x2).asArray(null)).asMessage().asOneLine().is("Argument 'elementType' cannot be null.");
127 	}
128 
129 	@Test void bb02_asIntArray() {
130 		int[] x1 = {1}, nil = null;
131 		var x2 = "";
132 		test(x1).asIntArray().isString("[1]");
133 		test(nil).asIntArray().isNull();
134 		assertThrown(()->test(x2).asIntArray()).asMessage().asOneLine().is("Object was not type 'int[]'.  Actual='java.lang.String'.");
135 	}
136 
137 	@Test void bb03_asLongArray() {
138 		long[] x1 = {1}, nil = null;
139 		var x2 = "";
140 		test(x1).asLongArray().isString("[1]");
141 		test(nil).asLongArray().isNull();
142 		assertThrown(()->test(x2).asLongArray()).asMessage().asOneLine().is("Object was not type 'long[]'.  Actual='java.lang.String'.");
143 	}
144 
145 	@Test void bb04_asShortArray() {
146 		short[] x1 = {1}, nil = null;
147 		var x2 = "";
148 		test(x1).asShortArray().isString("[1]");
149 		test(nil).asShortArray().isNull();
150 		assertThrown(()->test(x2).asShortArray()).asMessage().asOneLine().is("Object was not type 'short[]'.  Actual='java.lang.String'.");
151 	}
152 
153 	@Test void bb05_asFloatArray() {
154 		float[] x1 = {1}, nil = null;
155 		var x2 = "";
156 		test(x1).asFloatArray().isString("[1.0]");
157 		test(nil).asFloatArray().isNull();
158 		assertThrown(()->test(x2).asFloatArray()).asMessage().asOneLine().is("Object was not type 'float[]'.  Actual='java.lang.String'.");
159 	}
160 
161 	@Test void bb06_asDoubleArray() {
162 		double[] x1 = {1}, nil = null;
163 		var x2 = "";
164 		test(x1).asDoubleArray().isString("[1.0]");
165 		test(nil).asDoubleArray().isNull();
166 		assertThrown(()->test(x2).asDoubleArray()).asMessage().asOneLine().is("Object was not type 'double[]'.  Actual='java.lang.String'.");
167 	}
168 
169 	@Test void bb07_asCharArray() {
170 		char[] x1 = {'a'}, nil = null;
171 		var x2 = "";
172 		test(x1).asCharArray().isString("[a]");
173 		test(nil).asCharArray().isNull();
174 		assertThrown(()->test(x2).asCharArray()).asMessage().asOneLine().is("Object was not type 'char[]'.  Actual='java.lang.String'.");
175 	}
176 
177 	@Test void bb08_asByteArray() {
178 		byte[] x1 = {1}, nil = null;
179 		var x2 = "";
180 		test(x1).asByteArray().isString("[1]");
181 		test(nil).asByteArray().isNull();
182 		assertThrown(()->test(x2).asByteArray()).asMessage().asOneLine().is("Object was not type 'byte[]'.  Actual='java.lang.String'.");
183 	}
184 
185 	@Test void bb09_asBooleanArray() {
186 		boolean[] x1 = {true}, nil = null;
187 		var x2 = "";
188 		test(x1).asBooleanArray().isString("[true]");
189 		test(nil).asBooleanArray().isNull();
190 		assertThrown(()->test(x2).asBooleanArray()).asMessage().asOneLine().is("Object was not type 'boolean[]'.  Actual='java.lang.String'.");
191 	}
192 
193 	@Test void bb10_asBoolean() {
194 		var x1 = true;
195 		var nil = n(Boolean.class);
196 		var x2 = "";
197 		test(x1).asBoolean().isString("true");
198 		test(nil).asBoolean().isNull();
199 		assertThrown(()->test(x2).asBoolean()).asMessage().asOneLine().is("Object was not type 'java.lang.Boolean'.  Actual='java.lang.String'.");
200 	}
201 
202 	@Test void bb11_asBytes() {
203 		byte[] x1 = {'a'}, nil = null;
204 		var x2 = "";
205 		test(x1).asBytes().isString("a");
206 		test(nil).asBytes().isNull();
207 		assertThrown(()->test(x2).asBytes()).asMessage().asOneLine().is("Object was not type 'byte[]'.  Actual='java.lang.String'.");
208 	}
209 
210 	@Test void bb12_asCollection() {
211 		var x1 = alist(1);
212 		var nil = nlist(Integer.class);
213 		var x2 = "";
214 		test(x1).asCollection().isString("[1]");
215 		test(nil).asCollection().isNull();
216 		assertThrown(()->test(x2).asCollection()).asMessage().asOneLine().is("Object was not type 'java.util.Collection'.  Actual='java.lang.String'.");
217 	}
218 
219 	@Test void bb13_asCollection_wType() {
220 		var x1 = alist(1);
221 		var nil = nlist(Integer.class);
222 		var x2 = "";
223 		test(x1).asCollection(Integer.class).isString("[1]");
224 		test(nil).asCollection(Integer.class).isNull();
225 		assertThrown(()->test(x2).asCollection(Integer.class)).asMessage().asOneLine().is("Object was not type 'java.util.Collection'.  Actual='java.lang.String'.");
226 		assertThrowsWithMessage(IllegalArgumentException.class, "Argument 'elementType' cannot be null.", ()->test(x1).asCollection(null));
227 	}
228 
229 	@Test void bb14_asComparable() {
230 		var x1 = 1;
231 		var nil = n(Integer.class);
232 		var x2 = list();
233 		test(x1).asComparable().isString("1");
234 		test(nil).asComparable().isNull();
235 		assertThrown(()->test(x2).asComparable()).asMessage().asOneLine().is("Object was not type 'java.lang.Comparable'.  Actual='java.util.ArrayList'.");
236 	}
237 
238 	@Test void bb15_asDate() {
239 		var x1 = date("2000-06-01T12:34:56Z");
240 		var nil = n(Date.class);
241 		var x2 = "";
242 		test(x1).asDate().asString().isMatches("*2000");
243 		test(nil).asDate().isNull();
244 		assertThrown(()->test(x2).asDate()).asMessage().asOneLine().is("Object was not type 'java.util.Date'.  Actual='java.lang.String'.");
245 	}
246 
247 	@Test void bb16_asInteger() {
248 		var x1 = 1;
249 		var nil = n(Integer.class);
250 		var x2 = "";
251 		test(x1).asInteger().isString("1");
252 		test(nil).asInteger().isNull();
253 		assertThrown(()->test(x2).asInteger()).asMessage().asOneLine().is("Object was not type 'java.lang.Integer'.  Actual='java.lang.String'.");
254 	}
255 
256 	@Test void bb17_asLong() {
257 		var x1 = 1L;
258 		var nil = n(Long.class);
259 		var x2 = "";
260 		test(x1).asLong().isString("1");
261 		test(nil).asLong().isNull();
262 		assertThrown(()->test(x2).asLong()).asMessage().asOneLine().is("Object was not type 'java.lang.Long'.  Actual='java.lang.String'.");
263 	}
264 
265 	@Test void bb18_asList() {
266 		var x1 = alist(1);
267 		var nil = nlist(Integer.class);
268 		var x2 = "";
269 		test(x1).asList().isString("[1]");
270 		test(nil).asList().isNull();
271 		assertThrown(()->test(x2).asList()).asMessage().asOneLine().is("Object was not type 'java.util.List'.  Actual='java.lang.String'.");
272 	}
273 
274 	@Test void bb19_asList_wType() {
275 		var x1 = alist(1);
276 		var nil = nlist(Integer.class);
277 		var x2 = "";
278 		test(x1).asList(Integer.class).isString("[1]");
279 		test(nil).asList(Integer.class).isNull();
280 		assertThrown(()->test(x2).asList(Integer.class)).asMessage().asOneLine().is("Object was not type 'java.util.List'.  Actual='java.lang.String'.");
281 		assertThrowsWithMessage(IllegalArgumentException.class, "Argument 'elementType' cannot be null.", ()->test(x1).asCollection(null));
282 	}
283 
284 	@Test void bb20_asMap() {
285 		var x1 = map("a",2);
286 		var nil = (Map<String,Integer>)null;
287 		var x2 = "";
288 		test(x1).asMap().isString("{a=2}");
289 		test(nil).asMap().isNull();
290 		assertThrown(()->test(x2).asMap()).asMessage().asOneLine().is("Object was not type 'java.util.Map'.  Actual='java.lang.String'.");
291 	}
292 
293 	@Test void bb21_asMap_wTypes() {
294 		var x1 = map("a",2);
295 		var nil = (Map<String,Integer>)null;
296 		var x2 = "";
297 		test(x1).asMap(String.class,Integer.class).isString("{a=2}");
298 		test(nil).asMap(String.class,Integer.class).isNull();
299 		assertThrown(()->test(x2).asMap(String.class,Integer.class)).asMessage().asOneLine().is("Object was not type 'java.util.Map'.  Actual='java.lang.String'.");
300 		assertThrowsWithMessage(IllegalArgumentException.class, "Argument 'keyType' cannot be null.", ()->test(x1).asMap(null,Integer.class));
301 		assertThrowsWithMessage(IllegalArgumentException.class, "Argument 'valueType' cannot be null.", ()->test(x1).asMap(String.class,null));
302 	}
303 
304 	@Test void bb22_asBean() {
305 		var x1 = A1;
306 		var nil = (A1)null;
307 		test(x1).asBean().isString("a=1,b=2");
308 		test(nil).asBean().isNull();
309 	}
310 
311 	@Test void bb23_asBean_wType() {
312 		var x1 = A1;
313 		var nil = n(A1.class);
314 		var x2 = "";
315 		test(x1).asBean().isString("a=1,b=2");
316 		test(nil).asBean(A1.class).isNull();
317 		assertThrown(()->test(x2).asBean(A2.class)).asMessage().asOneLine().is("Object was not type 'org.apache.juneau.assertions.AnyAssertion_Test$A2'.  Actual='java.lang.String'.");
318 		assertThrowsWithMessage(IllegalArgumentException.class, "Argument 'beanType' cannot be null.", ()->test(x1).asBean(null));
319 	}
320 
321 	@Test void bb24_asBeanList() {
322 		var x1 = alist(A1);
323 		var nil = nlist(A1.class);
324 		var x2 = "";
325 		test(x1).asBeanList(A1.class).isString("[a=1,b=2]");
326 		test(nil).asBeanList(A1.class).isNull();
327 		assertThrown(()->test(x2).asBeanList(A2.class)).asMessage().asOneLine().is("Object was not type 'java.util.List'.  Actual='java.lang.String'.");
328 		assertThrowsWithMessage(IllegalArgumentException.class, "Argument 'beanType' cannot be null.", ()->test(x1).asBeanList(null));
329 	}
330 
331 	@Test void bb25_asZonedDateTime() {
332 		var x1 = zdt("2000-06-01T12:34:56Z");
333 		var nil = n(Object.class);
334 		var x2 = "";
335 		test(x1).asZonedDateTime().asString().isMatches("2000*");
336 		test(nil).asZonedDateTime().isNull();
337 		assertThrown(()->test(x2).asZonedDateTime()).asMessage().asOneLine().is("Object was not type 'java.time.ZonedDateTime'.  Actual='java.lang.String'.");
338 	}
339 
340 	@Test void bb26_asStringList() {
341 		var x1 = alist("1");
342 		var nil = nlist(String.class);
343 		var x2 = "";
344 		test(x1).asStringList().isString("[1]");
345 		test(nil).asStringList().isNull();
346 		assertThrown(()->test(x2).asStringList()).asMessage().asOneLine().is("Object was not type 'java.util.List'.  Actual='java.lang.String'.");
347 	}
348 
349 	//-----------------------------------------------------------------------------------------------------------------
350 	// Test tests
351 	//-----------------------------------------------------------------------------------------------------------------
352 
353 	@Test void ca01_exists() {
354 		var x = 1;
355 		var nil = n(Integer.class);
356 		test(x).isExists().isExists();
357 		assertThrowsWithMessage(BasicAssertionError.class, "Value was null.", ()->test(nil).isExists());
358 	}
359 
360 	@Test void ca02_isNull() {
361 		var x = 1;
362 		var nil = n(Integer.class);
363 		test(nil).isNull();
364 		assertThrowsWithMessage(BasicAssertionError.class, "Value was not null.", ()->test(x).isNull());
365 	}
366 
367 	@Test void ca03_isNotNull() {
368 		var x = 1;
369 		var nil = n(Integer.class);
370 		test(x).isNotNull();
371 		assertThrowsWithMessage(BasicAssertionError.class, "Value was null.", ()->test(nil).isNotNull());
372 	}
373 
374 	@Test void ca04a_is_T() {
375 		var x1 = 1;
376 		var x1a = 1;
377 		var x2 = 2;
378 		var nil = n(Integer.class);
379 		test(x1).is(x1);
380 		test(x1).is(x1a);
381 		test(nil).is(nil);
382 		assertThrown(()->test(x1).is(x2)).asMessage().asOneLine().is("Unexpected value.  Expect='2'.  Actual='1'.");
383 		assertThrown(()->test(x1).is(nil)).asMessage().asOneLine().is("Unexpected value.  Expect='null'.  Actual='1'.");
384 		assertThrown(()->test(nil).is(x2)).asMessage().asOneLine().is("Unexpected value.  Expect='2'.  Actual='null'.");
385 	}
386 
387 	@Test void ca04b_is_predicate() {
388 		var x1 = 1;
389 		test(x1).is(x->x==1);
390 		assertThrown(()->test(x1).is(x->x==2)).asMessage().asOneLine().is("Unexpected value: '1'.");
391 		assertThrown(()->test(x1).is(ne(x1))).asMessage().asOneLine().is("Value unexpectedly matched.  Value='1'.");
392 	}
393 
394 	@Test void ca05_isNot() {
395 		var x1 = 1;
396 		var x1a = 1;
397 		var x2 = 2;
398 		var nil = n(Integer.class);
399 		test(x1).isNot(x2);
400 		test(x1).isNot(nil);
401 		test(nil).isNot(x1);
402 		assertThrown(()->test(x1).isNot(x1a)).asMessage().asOneLine().is("Unexpected value.  Did not expect='1'.  Actual='1'.");
403 		assertThrown(()->test(nil).isNot(nil)).asMessage().asOneLine().is("Unexpected value.  Did not expect='null'.  Actual='null'.");
404 	}
405 
406 	@Test void ca06_isAny() {
407 		var x1 = 1;
408 		var x1a = 1;
409 		var x2 = 2;
410 		var nil = n(Integer.class);
411 		test(x1).isAny(x1a, x2);
412 		assertThrown(()->test(x1).isAny(x2)).asMessage().asOneLine().is("Expected value not found.  Expect='[2]'.  Actual='1'.");
413 		assertThrown(()->test(x1).isAny()).asMessage().asOneLine().is("Expected value not found.  Expect='[]'.  Actual='1'.");
414 		assertThrown(()->test(nil).isAny(x2)).asMessage().asOneLine().is("Expected value not found.  Expect='[2]'.  Actual='null'.");
415 	}
416 
417 	@Test void ca07_isNotAny() {
418 		var x1 = 1;
419 		var x1a = 1;
420 		var x2 = 2;
421 		var nil = n(Integer.class);
422 		test(x1).isNotAny(x2);
423 		test(x1).isNotAny();
424 		test(nil).isNotAny(x2);
425 		assertThrown(()->test(x1).isNotAny(x1a)).asMessage().asOneLine().is("Unexpected value found.  Unexpected='1'.  Actual='1'.");
426 		assertThrown(()->test(nil).isNotAny(nil)).asMessage().asOneLine().is("Unexpected value found.  Unexpected='null'.  Actual='null'.");
427 	}
428 
429 	@Test void ca08_isSame() {
430 		var x1 = Integer.valueOf(999);
431 		var x1a = Integer.valueOf(999);
432 		var nil = n(Integer.class);
433 		test(x1).isSame(x1);
434 		test(nil).isSame(nil);
435 		assertThrown(()->test(x1).isSame(x1a)).asMessage().asOneLine().isMatches("Not the same value.  Expect='999(Integer@*)'.  Actual='999(Integer@*)'.");
436 		assertThrown(()->test(nil).isSame(x1a)).asMessage().asOneLine().isMatches("Not the same value.  Expect='999(Integer@*)'.  Actual='null(null)'.");
437 		assertThrown(()->test(x1).isSame(nil)).asMessage().asOneLine().isMatches("Not the same value.  Expect='null(null)'.  Actual='999(Integer@*)'.");
438 	}
439 
440 	@Test void ca09_isSameJsonAs() {
441 		var x1 = 1;
442 		var x1a = 1;
443 		var x2 = 2;
444 		var nil = n(Integer.class);
445 		test(x1).isSameJsonAs(x1a);
446 		test(nil).isSameJsonAs(nil);
447 		assertThrown(()->test(x1a).isSameJsonAs(x2)).asMessage().asOneLine().is("Unexpected comparison.  Expect='2'.  Actual='1'.");
448 		assertThrown(()->test(nil).isSameJsonAs(x2)).asMessage().asOneLine().is("Unexpected comparison.  Expect='2'.  Actual='null'.");
449 		assertThrown(()->test(x1).isSameJsonAs(nil)).asMessage().asOneLine().is("Unexpected comparison.  Expect='null'.  Actual='1'.");
450 	}
451 
452 	@Test void ca10_isSameSortedJsonAs() {
453 		var x1 = 1;
454 		var x1a = 1;
455 		var x2 = 2;
456 		var nil = n(Integer.class);
457 		test(x1).isSameSortedJsonAs(x1a);
458 		test(nil).isSameSortedJsonAs(nil);
459 		assertThrown(()->test(x1a).isSameSortedJsonAs(x2)).asMessage().asOneLine().is("Unexpected comparison.  Expect='2'.  Actual='1'.");
460 		assertThrown(()->test(nil).isSameSortedJsonAs(x2)).asMessage().asOneLine().is("Unexpected comparison.  Expect='2'.  Actual='null'.");
461 		assertThrown(()->test(x1).isSameSortedJsonAs(nil)).asMessage().asOneLine().is("Unexpected comparison.  Expect='null'.  Actual='1'.");
462 	}
463 
464 	@Test void ca11_isSameSerializedAs() {
465 		var x1 = 1;
466 		var x1a = 1;
467 		var x2 = 2;
468 		var nil = n(Integer.class);
469 		var s = Json5Serializer.DEFAULT;
470 		test(x1).isSameSerializedAs(x1a, s);
471 		test(nil).isSameSerializedAs(nil, s);
472 		assertThrown(()->test(x1a).isSameSerializedAs(x2, s)).asMessage().asOneLine().is("Unexpected comparison.  Expect='2'.  Actual='1'.");
473 		assertThrown(()->test(nil).isSameSerializedAs(x2, s)).asMessage().asOneLine().is("Unexpected comparison.  Expect='2'.  Actual='null'.");
474 		assertThrown(()->test(x1).isSameSerializedAs(nil, s)).asMessage().asOneLine().is("Unexpected comparison.  Expect='null'.  Actual='1'.");
475 	}
476 
477 	@Test void ca12_isType() {
478 		var x = 1;
479 		var nil = n(Integer.class);
480 		test(x).isType(Integer.class);
481 		test(x).isType(Object.class);
482 		assertThrown(()->test(x).isType(String.class)).asMessage().asOneLine().is("Unexpected type.  Expect='java.lang.String'.  Actual='java.lang.Integer'.");
483 		assertThrown(()->test(nil).isType(String.class)).asMessage().asOneLine().is("Value was null.");
484 		assertThrown(()->test(x).isType(null)).asMessage().asOneLine().is("Argument 'parent' cannot be null.");
485 	}
486 
487 	@Test void ca13_isExactType() {
488 		var x = 1;
489 		var nil = n(Integer.class);
490 		test(x).isExactType(Integer.class);
491 		assertThrown(()->test(x).isExactType(Object.class)).asMessage().asOneLine().is("Unexpected type.  Expect='java.lang.Object'.  Actual='java.lang.Integer'.");
492 		assertThrown(()->test(x).isExactType(String.class)).asMessage().asOneLine().is("Unexpected type.  Expect='java.lang.String'.  Actual='java.lang.Integer'.");
493 		assertThrown(()->test(nil).isExactType(String.class)).asMessage().asOneLine().is("Value was null.");
494 		assertThrown(()->test(x).isExactType(null)).asMessage().asOneLine().is("Argument 'parent' cannot be null.");
495 	}
496 
497 	@Test void ca14_isString() {
498 		var x = 1;
499 		var nil = n(Integer.class);
500 		test(x).isString("1");
501 		test(nil).isString(null);
502 		assertThrown(()->test(x).isString("bad")).asMessage().asOneLine().is("String differed at position 0.  Expect='bad'.  Actual='1'.");
503 		assertThrown(()->test(x).isString(null)).asMessage().asOneLine().is("String differed at position 0.  Expect='null'.  Actual='1'.");
504 		assertThrown(()->test(nil).isString("bad")).asMessage().asOneLine().is("String differed at position 0.  Expect='bad'.  Actual='null'.");
505 	}
506 
507 	@Test void ca15_isJson() {
508 		var x = 1;
509 		var nil = n(Integer.class);
510 		test(x).isJson("1");
511 		test(nil).isJson("null");
512 		assertThrown(()->test(x).isJson("bad")).asMessage().asOneLine().is("String differed at position 0.  Expect='bad'.  Actual='1'.");
513 		assertThrown(()->test(x).isJson(null)).asMessage().asOneLine().is("String differed at position 0.  Expect='null'.  Actual='1'.");
514 		assertThrown(()->test(nil).isJson("bad")).asMessage().asOneLine().is("String differed at position 0.  Expect='bad'.  Actual='null'.");
515 	}
516 }