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