Completed
Push — develop ( c3e516...743077 )
by Jaap
24s
created

Assert::assertJson()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 2
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
/*
3
 * This file is part of PHPUnit.
4
 *
5
 * (c) Sebastian Bergmann <[email protected]>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 *
10
 * This file is added for benchmark purposes only!!!
11
 */
12
namespace PHPUnit\Framework;
13
14
use ArrayAccess;
15
use Countable;
16
use DOMDocument;
17
use DOMElement;
18
use PHPUnit\Framework\Constraint\ArrayHasKey;
19
use PHPUnit\Framework\Constraint\ArraySubset;
20
use PHPUnit\Framework\Constraint\Attribute;
21
use PHPUnit\Framework\Constraint\Callback;
22
use PHPUnit\Framework\Constraint\ClassHasAttribute;
23
use PHPUnit\Framework\Constraint\ClassHasStaticAttribute;
24
use PHPUnit\Framework\Constraint\Constraint;
25
use PHPUnit\Framework\Constraint\Count;
26
use PHPUnit\Framework\Constraint\DirectoryExists;
27
use PHPUnit\Framework\Constraint\FileExists;
28
use PHPUnit\Framework\Constraint\GreaterThan;
29
use PHPUnit\Framework\Constraint\IsAnything;
30
use PHPUnit\Framework\Constraint\IsEmpty;
31
use PHPUnit\Framework\Constraint\IsEqual;
32
use PHPUnit\Framework\Constraint\IsFalse;
33
use PHPUnit\Framework\Constraint\IsFinite;
34
use PHPUnit\Framework\Constraint\IsIdentical;
35
use PHPUnit\Framework\Constraint\IsInfinite;
36
use PHPUnit\Framework\Constraint\IsInstanceOf;
37
use PHPUnit\Framework\Constraint\IsJson;
38
use PHPUnit\Framework\Constraint\IsNan;
39
use PHPUnit\Framework\Constraint\IsNull;
40
use PHPUnit\Framework\Constraint\IsReadable;
41
use PHPUnit\Framework\Constraint\IsTrue;
42
use PHPUnit\Framework\Constraint\IsType;
43
use PHPUnit\Framework\Constraint\IsWritable;
44
use PHPUnit\Framework\Constraint\JsonMatches;
45
use PHPUnit\Framework\Constraint\LessThan;
46
use PHPUnit\Framework\Constraint\LogicalAnd;
47
use PHPUnit\Framework\Constraint\LogicalNot;
48
use PHPUnit\Framework\Constraint\LogicalOr;
49
use PHPUnit\Framework\Constraint\LogicalXor;
50
use PHPUnit\Framework\Constraint\ObjectHasAttribute;
51
use PHPUnit\Framework\Constraint\RegularExpression;
52
use PHPUnit\Framework\Constraint\SameSize;
53
use PHPUnit\Framework\Constraint\StringContains;
54
use PHPUnit\Framework\Constraint\StringEndsWith;
55
use PHPUnit\Framework\Constraint\StringMatchesFormatDescription;
56
use PHPUnit\Framework\Constraint\StringStartsWith;
57
use PHPUnit\Framework\Constraint\TraversableContains;
58
use PHPUnit\Framework\Constraint\TraversableContainsOnly;
59
use PHPUnit\Util\InvalidArgumentHelper;
60
use PHPUnit\Util\Type;
61
use PHPUnit\Util\Xml;
62
use ReflectionClass;
63
use ReflectionException;
64
use ReflectionObject;
65
use Traversable;
66
67
/**
68
 * A set of assertion methods.
69
 */
70
abstract class Assert
71
{
72
    /**
73
     * @var int
74
     */
75
    private static $count = 0;
76
77
    /**
78
     * Asserts that an array has a specified key.
79
     *
80
     * @param int|string        $key
81
     * @param array|ArrayAccess $array
82
     *
83
     * @throws ExpectationFailedException
84
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
85
     * @throws Exception
86
     */
87
    public static function assertArrayHasKey($key, $array, string $message = ''): void
88
    {
89
        if (!(\is_int($key) || \is_string($key))) {
90
            throw InvalidArgumentHelper::factory(
91
                1,
92
                'integer or string'
93
            );
94
        }
95
96
        if (!(\is_array($array) || $array instanceof ArrayAccess)) {
97
            throw InvalidArgumentHelper::factory(
98
                2,
99
                'array or ArrayAccess'
100
            );
101
        }
102
103
        $constraint = new ArrayHasKey($key);
104
105
        static::assertThat($array, $constraint, $message);
106
    }
107
108
    /**
109
     * Asserts that an array has a specified subset.
110
     *
111
     * @param array|ArrayAccess $subset
112
     * @param array|ArrayAccess $array
113
     *
114
     * @throws ExpectationFailedException
115
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
116
     * @throws Exception
117
     *
118
     * @codeCoverageIgnore
119
     *
120
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3494
121
     */
122
    public static function assertArraySubset($subset, $array, bool $checkForObjectIdentity = false, string $message = ''): void
123
    {
124
        self::createWarning('assertArraySubset() is deprecated and will be removed in PHPUnit 9.');
125
126
        if (!(\is_array($subset) || $subset instanceof ArrayAccess)) {
127
            throw InvalidArgumentHelper::factory(
128
                1,
129
                'array or ArrayAccess'
130
            );
131
        }
132
133
        if (!(\is_array($array) || $array instanceof ArrayAccess)) {
134
            throw InvalidArgumentHelper::factory(
135
                2,
136
                'array or ArrayAccess'
137
            );
138
        }
139
140
        $constraint = new ArraySubset($subset, $checkForObjectIdentity);
141
142
        static::assertThat($array, $constraint, $message);
143
    }
144
145
    /**
146
     * Asserts that an array does not have a specified key.
147
     *
148
     * @param int|string        $key
149
     * @param array|ArrayAccess $array
150
     *
151
     * @throws ExpectationFailedException
152
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
153
     * @throws Exception
154
     */
155
    public static function assertArrayNotHasKey($key, $array, string $message = ''): void
156
    {
157
        if (!(\is_int($key) || \is_string($key))) {
158
            throw InvalidArgumentHelper::factory(
159
                1,
160
                'integer or string'
161
            );
162
        }
163
164
        if (!(\is_array($array) || $array instanceof ArrayAccess)) {
165
            throw InvalidArgumentHelper::factory(
166
                2,
167
                'array or ArrayAccess'
168
            );
169
        }
170
171
        $constraint = new LogicalNot(
172
            new ArrayHasKey($key)
173
        );
174
175
        static::assertThat($array, $constraint, $message);
176
    }
177
178
    /**
179
     * Asserts that a haystack contains a needle.
180
     *
181
     * @throws ExpectationFailedException
182
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
183
     * @throws Exception
184
     */
185
    public static function assertContains($needle, $haystack, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void
186
    {
187
        // @codeCoverageIgnoreStart
188
        if (\is_string($haystack)) {
189
            self::createWarning('Using assertContains() with string haystacks is deprecated and will not be supported in PHPUnit 9. Refactor your test to use assertStringContainsString() or assertStringContainsStringIgnoringCase() instead.');
190
        }
191
192
        if (!$checkForObjectIdentity) {
193
            self::createWarning('The optional $checkForObjectIdentity parameter of assertContains() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertContainsEquals() instead.');
194
        }
195
196
        if ($checkForNonObjectIdentity) {
197
            self::createWarning('The optional $checkForNonObjectIdentity parameter of assertContains() is deprecated and will be removed in PHPUnit 9.');
198
        }
199
200
        if ($ignoreCase) {
201
            self::createWarning('The optional $ignoreCase parameter of assertContains() is deprecated and will be removed in PHPUnit 9.');
202
        }
203
        // @codeCoverageIgnoreEnd
204
205
        if (\is_array($haystack) ||
206
            (\is_object($haystack) && $haystack instanceof Traversable)) {
207
            $constraint = new TraversableContains(
208
                $needle,
209
                $checkForObjectIdentity,
210
                $checkForNonObjectIdentity
211
            );
212
        } elseif (\is_string($haystack)) {
213
            if (!\is_string($needle)) {
214
                throw InvalidArgumentHelper::factory(
215
                    1,
216
                    'string'
217
                );
218
            }
219
220
            $constraint = new StringContains(
221
                $needle,
222
                $ignoreCase
223
            );
224
        } else {
225
            throw InvalidArgumentHelper::factory(
226
                2,
227
                'array, traversable or string'
228
            );
229
        }
230
231
        static::assertThat($haystack, $constraint, $message);
232
    }
233
234
    public static function assertContainsEquals($needle, iterable $haystack, string $message = ''): void
235
    {
236
        $constraint = new TraversableContains($needle, false, false);
237
238
        static::assertThat($haystack, $constraint, $message);
239
    }
240
241
    /**
242
     * Asserts that a haystack that is stored in a static attribute of a class
243
     * or an attribute of an object contains a needle.
244
     *
245
     * @param object|string $haystackClassOrObject
246
     *
247
     * @throws ExpectationFailedException
248
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
249
     * @throws ReflectionException
250
     * @throws Exception
251
     *
252
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
253
     * @codeCoverageIgnore
254
     */
255
    public static function assertAttributeContains($needle, string $haystackAttributeName, $haystackClassOrObject, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void
256
    {
257
        self::createWarning('assertAttributeContains() is deprecated and will be removed in PHPUnit 9.');
258
259
        static::assertContains(
260
            $needle,
261
            static::readAttribute($haystackClassOrObject, $haystackAttributeName),
262
            $message,
263
            $ignoreCase,
264
            $checkForObjectIdentity,
265
            $checkForNonObjectIdentity
266
        );
267
    }
268
269
    /**
270
     * Asserts that a haystack does not contain a needle.
271
     *
272
     * @throws ExpectationFailedException
273
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
274
     * @throws Exception
275
     */
276
    public static function assertNotContains($needle, $haystack, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void
277
    {
278
        // @codeCoverageIgnoreStart
279
        if (\is_string($haystack)) {
280
            self::createWarning('Using assertNotContains() with string haystacks is deprecated and will not be supported in PHPUnit 9. Refactor your test to use assertStringNotContainsString() or assertStringNotContainsStringIgnoringCase() instead.');
281
        }
282
283
        if (!$checkForObjectIdentity) {
284
            self::createWarning('The optional $checkForObjectIdentity parameter of assertNotContains() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertNotContainsEquals() instead.');
285
        }
286
287
        if ($checkForNonObjectIdentity) {
288
            self::createWarning('The optional $checkForNonObjectIdentity parameter of assertNotContains() is deprecated and will be removed in PHPUnit 9.');
289
        }
290
291
        if ($ignoreCase) {
292
            self::createWarning('The optional $ignoreCase parameter of assertNotContains() is deprecated and will be removed in PHPUnit 9.');
293
        }
294
        // @codeCoverageIgnoreEnd
295
296
        if (\is_array($haystack) ||
297
            (\is_object($haystack) && $haystack instanceof Traversable)) {
298
            $constraint = new LogicalNot(
299
                new TraversableContains(
300
                    $needle,
301
                    $checkForObjectIdentity,
302
                    $checkForNonObjectIdentity
303
                )
304
            );
305
        } elseif (\is_string($haystack)) {
306
            if (!\is_string($needle)) {
307
                throw InvalidArgumentHelper::factory(
308
                    1,
309
                    'string'
310
                );
311
            }
312
313
            $constraint = new LogicalNot(
314
                new StringContains(
315
                    $needle,
316
                    $ignoreCase
317
                )
318
            );
319
        } else {
320
            throw InvalidArgumentHelper::factory(
321
                2,
322
                'array, traversable or string'
323
            );
324
        }
325
326
        static::assertThat($haystack, $constraint, $message);
327
    }
328
329
    public static function assertNotContainsEquals($needle, iterable $haystack, string $message = ''): void
330
    {
331
        $constraint = new LogicalNot(new TraversableContains($needle, false, false));
332
333
        static::assertThat($haystack, $constraint, $message);
334
    }
335
336
    /**
337
     * Asserts that a haystack that is stored in a static attribute of a class
338
     * or an attribute of an object does not contain a needle.
339
     *
340
     * @param object|string $haystackClassOrObject
341
     *
342
     * @throws ExpectationFailedException
343
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
344
     * @throws ReflectionException
345
     * @throws Exception
346
     *
347
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
348
     * @codeCoverageIgnore
349
     */
350
    public static function assertAttributeNotContains($needle, string $haystackAttributeName, $haystackClassOrObject, string $message = '', bool $ignoreCase = false, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): void
351
    {
352
        self::createWarning('assertAttributeNotContains() is deprecated and will be removed in PHPUnit 9.');
353
354
        static::assertNotContains(
355
            $needle,
356
            static::readAttribute($haystackClassOrObject, $haystackAttributeName),
357
            $message,
358
            $ignoreCase,
359
            $checkForObjectIdentity,
360
            $checkForNonObjectIdentity
361
        );
362
    }
363
364
    /**
365
     * Asserts that a haystack contains only values of a given type.
366
     *
367
     * @throws ExpectationFailedException
368
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
369
     */
370
    public static function assertContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = ''): void
371
    {
372
        if ($isNativeType === null) {
373
            $isNativeType = Type::isType($type);
374
        }
375
376
        static::assertThat(
377
            $haystack,
378
            new TraversableContainsOnly(
379
                $type,
380
                $isNativeType
381
            ),
382
            $message
383
        );
384
    }
385
386
    /**
387
     * Asserts that a haystack contains only instances of a given class name.
388
     *
389
     * @throws ExpectationFailedException
390
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
391
     */
392
    public static function assertContainsOnlyInstancesOf(string $className, iterable $haystack, string $message = ''): void
393
    {
394
        static::assertThat(
395
            $haystack,
396
            new TraversableContainsOnly(
397
                $className,
398
                false
399
            ),
400
            $message
401
        );
402
    }
403
404
    /**
405
     * Asserts that a haystack that is stored in a static attribute of a class
406
     * or an attribute of an object contains only values of a given type.
407
     *
408
     * @param object|string $haystackClassOrObject
409
     * @param bool          $isNativeType
410
     *
411
     * @throws ExpectationFailedException
412
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
413
     * @throws ReflectionException
414
     * @throws Exception
415
     *
416
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
417
     * @codeCoverageIgnore
418
     */
419
    public static function assertAttributeContainsOnly(string $type, string $haystackAttributeName, $haystackClassOrObject, ?bool $isNativeType = null, string $message = ''): void
420
    {
421
        self::createWarning('assertAttributeContainsOnly() is deprecated and will be removed in PHPUnit 9.');
422
423
        static::assertContainsOnly(
424
            $type,
425
            static::readAttribute($haystackClassOrObject, $haystackAttributeName),
426
            $isNativeType,
427
            $message
428
        );
429
    }
430
431
    /**
432
     * Asserts that a haystack does not contain only values of a given type.
433
     *
434
     * @throws ExpectationFailedException
435
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
436
     */
437
    public static function assertNotContainsOnly(string $type, iterable $haystack, ?bool $isNativeType = null, string $message = ''): void
438
    {
439
        if ($isNativeType === null) {
440
            $isNativeType = Type::isType($type);
441
        }
442
443
        static::assertThat(
444
            $haystack,
445
            new LogicalNot(
446
                new TraversableContainsOnly(
447
                    $type,
448
                    $isNativeType
449
                )
450
            ),
451
            $message
452
        );
453
    }
454
455
    /**
456
     * Asserts that a haystack that is stored in a static attribute of a class
457
     * or an attribute of an object does not contain only values of a given
458
     * type.
459
     *
460
     * @param object|string $haystackClassOrObject
461
     * @param bool          $isNativeType
462
     *
463
     * @throws ExpectationFailedException
464
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
465
     * @throws ReflectionException
466
     * @throws Exception
467
     *
468
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
469
     * @codeCoverageIgnore
470
     */
471
    public static function assertAttributeNotContainsOnly(string $type, string $haystackAttributeName, $haystackClassOrObject, ?bool $isNativeType = null, string $message = ''): void
472
    {
473
        self::createWarning('assertAttributeNotContainsOnly() is deprecated and will be removed in PHPUnit 9.');
474
475
        static::assertNotContainsOnly(
476
            $type,
477
            static::readAttribute($haystackClassOrObject, $haystackAttributeName),
478
            $isNativeType,
479
            $message
480
        );
481
    }
482
483
    /**
484
     * Asserts the number of elements of an array, Countable or Traversable.
485
     *
486
     * @param Countable|iterable $haystack
487
     *
488
     * @throws ExpectationFailedException
489
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
490
     * @throws Exception
491
     */
492
    public static function assertCount(int $expectedCount, $haystack, string $message = ''): void
493
    {
494
        if (!$haystack instanceof Countable && !\is_iterable($haystack)) {
495
            throw InvalidArgumentHelper::factory(2, 'countable or iterable');
496
        }
497
498
        static::assertThat(
499
            $haystack,
500
            new Count($expectedCount),
501
            $message
502
        );
503
    }
504
505
    /**
506
     * Asserts the number of elements of an array, Countable or Traversable
507
     * that is stored in an attribute.
508
     *
509
     * @param object|string $haystackClassOrObject
510
     *
511
     * @throws ExpectationFailedException
512
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
513
     * @throws ReflectionException
514
     * @throws Exception
515
     *
516
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
517
     * @codeCoverageIgnore
518
     */
519
    public static function assertAttributeCount(int $expectedCount, string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void
520
    {
521
        self::createWarning('assertAttributeCount() is deprecated and will be removed in PHPUnit 9.');
522
523
        static::assertCount(
524
            $expectedCount,
525
            static::readAttribute($haystackClassOrObject, $haystackAttributeName),
526
            $message
527
        );
528
    }
529
530
    /**
531
     * Asserts the number of elements of an array, Countable or Traversable.
532
     *
533
     * @param Countable|iterable $haystack
534
     *
535
     * @throws ExpectationFailedException
536
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
537
     * @throws Exception
538
     */
539
    public static function assertNotCount(int $expectedCount, $haystack, string $message = ''): void
540
    {
541
        if (!$haystack instanceof Countable && !\is_iterable($haystack)) {
542
            throw InvalidArgumentHelper::factory(2, 'countable or iterable');
543
        }
544
545
        $constraint = new LogicalNot(
546
            new Count($expectedCount)
547
        );
548
549
        static::assertThat($haystack, $constraint, $message);
550
    }
551
552
    /**
553
     * Asserts the number of elements of an array, Countable or Traversable
554
     * that is stored in an attribute.
555
     *
556
     * @param object|string $haystackClassOrObject
557
     *
558
     * @throws ExpectationFailedException
559
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
560
     * @throws ReflectionException
561
     * @throws Exception
562
     *
563
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
564
     * @codeCoverageIgnore
565
     */
566
    public static function assertAttributeNotCount(int $expectedCount, string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void
567
    {
568
        self::createWarning('assertAttributeNotCount() is deprecated and will be removed in PHPUnit 9.');
569
570
        static::assertNotCount(
571
            $expectedCount,
572
            static::readAttribute($haystackClassOrObject, $haystackAttributeName),
573
            $message
574
        );
575
    }
576
577
    /**
578
     * Asserts that two variables are equal.
579
     *
580
     * @throws ExpectationFailedException
581
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
582
     */
583
    public static function assertEquals($expected, $actual, string $message = '', float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): void
584
    {
585
        // @codeCoverageIgnoreStart
586
        if ($delta !== 0.0) {
587
            self::createWarning('The optional $delta parameter of assertEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertEqualsWithDelta() instead.');
588
        }
589
590
        if ($maxDepth !== 10) {
591
            self::createWarning('The optional $maxDepth parameter of assertEquals() is deprecated and will be removed in PHPUnit 9.');
592
        }
593
594
        if ($canonicalize) {
595
            self::createWarning('The optional $canonicalize parameter of assertEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertEqualsCanonicalizing() instead.');
596
        }
597
598
        if ($ignoreCase) {
599
            self::createWarning('The optional $ignoreCase parameter of assertEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertEqualsIgnoringCase() instead.');
600
        }
601
        // @codeCoverageIgnoreEnd
602
603
        $constraint = new IsEqual(
604
            $expected,
605
            $delta,
606
            $maxDepth,
607
            $canonicalize,
608
            $ignoreCase
609
        );
610
611
        static::assertThat($actual, $constraint, $message);
612
    }
613
614
    /**
615
     * Asserts that two variables are equal (canonicalizing).
616
     *
617
     * @throws ExpectationFailedException
618
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
619
     */
620
    public static function assertEqualsCanonicalizing($expected, $actual, string $message = ''): void
621
    {
622
        $constraint = new IsEqual(
623
            $expected,
624
            0.0,
625
            10,
626
            true,
627
            false
628
        );
629
630
        static::assertThat($actual, $constraint, $message);
631
    }
632
633
    /**
634
     * Asserts that two variables are equal (ignoring case).
635
     *
636
     * @throws ExpectationFailedException
637
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
638
     */
639
    public static function assertEqualsIgnoringCase($expected, $actual, string $message = ''): void
640
    {
641
        $constraint = new IsEqual(
642
            $expected,
643
            0.0,
644
            10,
645
            false,
646
            true
647
        );
648
649
        static::assertThat($actual, $constraint, $message);
650
    }
651
652
    /**
653
     * Asserts that two variables are equal (with delta).
654
     *
655
     * @throws ExpectationFailedException
656
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
657
     */
658
    public static function assertEqualsWithDelta($expected, $actual, float $delta, string $message = ''): void
659
    {
660
        $constraint = new IsEqual(
661
            $expected,
662
            $delta
663
        );
664
665
        static::assertThat($actual, $constraint, $message);
666
    }
667
668
    /**
669
     * Asserts that a variable is equal to an attribute of an object.
670
     *
671
     * @param object|string $actualClassOrObject
672
     *
673
     * @throws ExpectationFailedException
674
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
675
     * @throws ReflectionException
676
     * @throws Exception
677
     *
678
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
679
     * @codeCoverageIgnore
680
     */
681
    public static function assertAttributeEquals($expected, string $actualAttributeName, $actualClassOrObject, string $message = '', float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): void
682
    {
683
        self::createWarning('assertAttributeEquals() is deprecated and will be removed in PHPUnit 9.');
684
685
        static::assertEquals(
686
            $expected,
687
            static::readAttribute($actualClassOrObject, $actualAttributeName),
688
            $message,
689
            $delta,
690
            $maxDepth,
691
            $canonicalize,
692
            $ignoreCase
693
        );
694
    }
695
696
    /**
697
     * Asserts that two variables are not equal.
698
     *
699
     * @param float $delta
700
     * @param int   $maxDepth
701
     * @param bool  $canonicalize
702
     * @param bool  $ignoreCase
703
     *
704
     * @throws ExpectationFailedException
705
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
706
     */
707
    public static function assertNotEquals($expected, $actual, string $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = false, $ignoreCase = false): void
708
    {
709
        // @codeCoverageIgnoreStart
710
        if ($delta !== 0.0) {
711
            self::createWarning('The optional $delta parameter of assertNotEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertNotEqualsWithDelta() instead.');
712
        }
713
714
        if ($maxDepth !== 10) {
715
            self::createWarning('The optional $maxDepth parameter of assertNotEquals() is deprecated and will be removed in PHPUnit 9.');
716
        }
717
718
        if ($canonicalize) {
719
            self::createWarning('The optional $canonicalize parameter of assertNotEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertNotEqualsCanonicalizing() instead.');
720
        }
721
722
        if ($ignoreCase) {
723
            self::createWarning('The optional $ignoreCase parameter of assertNotEquals() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertNotEqualsIgnoringCase() instead.');
724
        }
725
        // @codeCoverageIgnoreEnd
726
727
        $constraint = new LogicalNot(
728
            new IsEqual(
729
                $expected,
730
                $delta,
731
                $maxDepth,
732
                $canonicalize,
733
                $ignoreCase
734
            )
735
        );
736
737
        static::assertThat($actual, $constraint, $message);
738
    }
739
740
    /**
741
     * Asserts that two variables are not equal (canonicalizing).
742
     *
743
     * @throws ExpectationFailedException
744
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
745
     */
746
    public static function assertNotEqualsCanonicalizing($expected, $actual, string $message = ''): void
747
    {
748
        $constraint = new LogicalNot(
749
            new IsEqual(
750
                $expected,
751
                0.0,
752
                10,
753
                true,
754
                false
755
            )
756
        );
757
758
        static::assertThat($actual, $constraint, $message);
759
    }
760
761
    /**
762
     * Asserts that two variables are not equal (ignoring case).
763
     *
764
     * @throws ExpectationFailedException
765
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
766
     */
767
    public static function assertNotEqualsIgnoringCase($expected, $actual, string $message = ''): void
768
    {
769
        $constraint = new LogicalNot(
770
            new IsEqual(
771
                $expected,
772
                0.0,
773
                10,
774
                false,
775
                true
776
            )
777
        );
778
779
        static::assertThat($actual, $constraint, $message);
780
    }
781
782
    /**
783
     * Asserts that two variables are not equal (with delta).
784
     *
785
     * @throws ExpectationFailedException
786
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
787
     */
788
    public static function assertNotEqualsWithDelta($expected, $actual, float $delta, string $message = ''): void
789
    {
790
        $constraint = new LogicalNot(
791
            new IsEqual(
792
                $expected,
793
                $delta
794
            )
795
        );
796
797
        static::assertThat($actual, $constraint, $message);
798
    }
799
800
    /**
801
     * Asserts that a variable is not equal to an attribute of an object.
802
     *
803
     * @param object|string $actualClassOrObject
804
     *
805
     * @throws ExpectationFailedException
806
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
807
     * @throws ReflectionException
808
     * @throws Exception
809
     *
810
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
811
     * @codeCoverageIgnore
812
     */
813
    public static function assertAttributeNotEquals($expected, string $actualAttributeName, $actualClassOrObject, string $message = '', float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): void
814
    {
815
        self::createWarning('assertAttributeNotEquals() is deprecated and will be removed in PHPUnit 9.');
816
817
        static::assertNotEquals(
818
            $expected,
819
            static::readAttribute($actualClassOrObject, $actualAttributeName),
820
            $message,
821
            $delta,
822
            $maxDepth,
823
            $canonicalize,
824
            $ignoreCase
825
        );
826
    }
827
828
    /**
829
     * Asserts that a variable is empty.
830
     *
831
     * @throws ExpectationFailedException
832
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
833
     */
834
    public static function assertEmpty($actual, string $message = ''): void
835
    {
836
        static::assertThat($actual, static::isEmpty(), $message);
837
    }
838
839
    /**
840
     * Asserts that a static attribute of a class or an attribute of an object
841
     * is empty.
842
     *
843
     * @param object|string $haystackClassOrObject
844
     *
845
     * @throws ExpectationFailedException
846
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
847
     * @throws ReflectionException
848
     * @throws Exception
849
     *
850
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
851
     * @codeCoverageIgnore
852
     */
853
    public static function assertAttributeEmpty(string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void
854
    {
855
        self::createWarning('assertAttributeEmpty() is deprecated and will be removed in PHPUnit 9.');
856
857
        static::assertEmpty(
858
            static::readAttribute($haystackClassOrObject, $haystackAttributeName),
859
            $message
860
        );
861
    }
862
863
    /**
864
     * Asserts that a variable is not empty.
865
     *
866
     * @throws ExpectationFailedException
867
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
868
     */
869
    public static function assertNotEmpty($actual, string $message = ''): void
870
    {
871
        static::assertThat($actual, static::logicalNot(static::isEmpty()), $message);
872
    }
873
874
    /**
875
     * Asserts that a static attribute of a class or an attribute of an object
876
     * is not empty.
877
     *
878
     * @param object|string $haystackClassOrObject
879
     *
880
     * @throws ExpectationFailedException
881
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
882
     * @throws ReflectionException
883
     * @throws Exception
884
     *
885
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
886
     * @codeCoverageIgnore
887
     */
888
    public static function assertAttributeNotEmpty(string $haystackAttributeName, $haystackClassOrObject, string $message = ''): void
889
    {
890
        self::createWarning('assertAttributeNotEmpty() is deprecated and will be removed in PHPUnit 9.');
891
892
        static::assertNotEmpty(
893
            static::readAttribute($haystackClassOrObject, $haystackAttributeName),
894
            $message
895
        );
896
    }
897
898
    /**
899
     * Asserts that a value is greater than another value.
900
     *
901
     * @throws ExpectationFailedException
902
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
903
     */
904
    public static function assertGreaterThan($expected, $actual, string $message = ''): void
905
    {
906
        static::assertThat($actual, static::greaterThan($expected), $message);
907
    }
908
909
    /**
910
     * Asserts that an attribute is greater than another value.
911
     *
912
     * @param object|string $actualClassOrObject
913
     *
914
     * @throws ExpectationFailedException
915
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
916
     * @throws ReflectionException
917
     * @throws Exception
918
     *
919
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
920
     * @codeCoverageIgnore
921
     */
922
    public static function assertAttributeGreaterThan($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void
923
    {
924
        self::createWarning('assertAttributeGreaterThan() is deprecated and will be removed in PHPUnit 9.');
925
926
        static::assertGreaterThan(
927
            $expected,
928
            static::readAttribute($actualClassOrObject, $actualAttributeName),
929
            $message
930
        );
931
    }
932
933
    /**
934
     * Asserts that a value is greater than or equal to another value.
935
     *
936
     * @throws ExpectationFailedException
937
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
938
     */
939
    public static function assertGreaterThanOrEqual($expected, $actual, string $message = ''): void
940
    {
941
        static::assertThat(
942
            $actual,
943
            static::greaterThanOrEqual($expected),
944
            $message
945
        );
946
    }
947
948
    /**
949
     * Asserts that an attribute is greater than or equal to another value.
950
     *
951
     * @param object|string $actualClassOrObject
952
     *
953
     * @throws ExpectationFailedException
954
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
955
     * @throws ReflectionException
956
     * @throws Exception
957
     *
958
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
959
     * @codeCoverageIgnore
960
     */
961
    public static function assertAttributeGreaterThanOrEqual($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void
962
    {
963
        self::createWarning('assertAttributeGreaterThanOrEqual() is deprecated and will be removed in PHPUnit 9.');
964
965
        static::assertGreaterThanOrEqual(
966
            $expected,
967
            static::readAttribute($actualClassOrObject, $actualAttributeName),
968
            $message
969
        );
970
    }
971
972
    /**
973
     * Asserts that a value is smaller than another value.
974
     *
975
     * @throws ExpectationFailedException
976
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
977
     */
978
    public static function assertLessThan($expected, $actual, string $message = ''): void
979
    {
980
        static::assertThat($actual, static::lessThan($expected), $message);
981
    }
982
983
    /**
984
     * Asserts that an attribute is smaller than another value.
985
     *
986
     * @param object|string $actualClassOrObject
987
     *
988
     * @throws ExpectationFailedException
989
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
990
     * @throws ReflectionException
991
     * @throws Exception
992
     *
993
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
994
     * @codeCoverageIgnore
995
     */
996
    public static function assertAttributeLessThan($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void
997
    {
998
        self::createWarning('assertAttributeLessThan() is deprecated and will be removed in PHPUnit 9.');
999
1000
        static::assertLessThan(
1001
            $expected,
1002
            static::readAttribute($actualClassOrObject, $actualAttributeName),
1003
            $message
1004
        );
1005
    }
1006
1007
    /**
1008
     * Asserts that a value is smaller than or equal to another value.
1009
     *
1010
     * @throws ExpectationFailedException
1011
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1012
     */
1013
    public static function assertLessThanOrEqual($expected, $actual, string $message = ''): void
1014
    {
1015
        static::assertThat($actual, static::lessThanOrEqual($expected), $message);
1016
    }
1017
1018
    /**
1019
     * Asserts that an attribute is smaller than or equal to another value.
1020
     *
1021
     * @param object|string $actualClassOrObject
1022
     *
1023
     * @throws ExpectationFailedException
1024
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1025
     * @throws ReflectionException
1026
     * @throws Exception
1027
     *
1028
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
1029
     * @codeCoverageIgnore
1030
     */
1031
    public static function assertAttributeLessThanOrEqual($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void
1032
    {
1033
        self::createWarning('assertAttributeLessThanOrEqual() is deprecated and will be removed in PHPUnit 9.');
1034
1035
        static::assertLessThanOrEqual(
1036
            $expected,
1037
            static::readAttribute($actualClassOrObject, $actualAttributeName),
1038
            $message
1039
        );
1040
    }
1041
1042
    /**
1043
     * Asserts that the contents of one file is equal to the contents of another
1044
     * file.
1045
     *
1046
     * @throws ExpectationFailedException
1047
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1048
     */
1049
    public static function assertFileEquals(string $expected, string $actual, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void
1050
    {
1051
        static::assertFileExists($expected, $message);
1052
        static::assertFileExists($actual, $message);
1053
1054
        $constraint = new IsEqual(
1055
            \file_get_contents($expected),
1056
            0.0,
1057
            10,
1058
            $canonicalize,
1059
            $ignoreCase
1060
        );
1061
1062
        static::assertThat(\file_get_contents($actual), $constraint, $message);
1063
    }
1064
1065
    /**
1066
     * Asserts that the contents of one file is not equal to the contents of
1067
     * another file.
1068
     *
1069
     * @throws ExpectationFailedException
1070
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1071
     */
1072
    public static function assertFileNotEquals(string $expected, string $actual, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void
1073
    {
1074
        static::assertFileExists($expected, $message);
1075
        static::assertFileExists($actual, $message);
1076
1077
        $constraint = new LogicalNot(
1078
            new IsEqual(
1079
                \file_get_contents($expected),
1080
                0.0,
1081
                10,
1082
                $canonicalize,
1083
                $ignoreCase
1084
            )
1085
        );
1086
1087
        static::assertThat(\file_get_contents($actual), $constraint, $message);
1088
    }
1089
1090
    /**
1091
     * Asserts that the contents of a string is equal
1092
     * to the contents of a file.
1093
     *
1094
     * @throws ExpectationFailedException
1095
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1096
     */
1097
    public static function assertStringEqualsFile(string $expectedFile, string $actualString, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void
1098
    {
1099
        static::assertFileExists($expectedFile, $message);
1100
1101
        $constraint = new IsEqual(
1102
            \file_get_contents($expectedFile),
1103
            0.0,
1104
            10,
1105
            $canonicalize,
1106
            $ignoreCase
1107
        );
1108
1109
        static::assertThat($actualString, $constraint, $message);
1110
    }
1111
1112
    /**
1113
     * Asserts that the contents of a string is not equal
1114
     * to the contents of a file.
1115
     *
1116
     * @throws ExpectationFailedException
1117
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1118
     */
1119
    public static function assertStringNotEqualsFile(string $expectedFile, string $actualString, string $message = '', bool $canonicalize = false, bool $ignoreCase = false): void
1120
    {
1121
        static::assertFileExists($expectedFile, $message);
1122
1123
        $constraint = new LogicalNot(
1124
            new IsEqual(
1125
                \file_get_contents($expectedFile),
1126
                0.0,
1127
                10,
1128
                $canonicalize,
1129
                $ignoreCase
1130
            )
1131
        );
1132
1133
        static::assertThat($actualString, $constraint, $message);
1134
    }
1135
1136
    /**
1137
     * Asserts that a file/dir is readable.
1138
     *
1139
     * @throws ExpectationFailedException
1140
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1141
     */
1142
    public static function assertIsReadable(string $filename, string $message = ''): void
1143
    {
1144
        static::assertThat($filename, new IsReadable, $message);
1145
    }
1146
1147
    /**
1148
     * Asserts that a file/dir exists and is not readable.
1149
     *
1150
     * @throws ExpectationFailedException
1151
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1152
     */
1153
    public static function assertNotIsReadable(string $filename, string $message = ''): void
1154
    {
1155
        static::assertThat($filename, new LogicalNot(new IsReadable), $message);
1156
    }
1157
1158
    /**
1159
     * Asserts that a file/dir exists and is writable.
1160
     *
1161
     * @throws ExpectationFailedException
1162
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1163
     */
1164
    public static function assertIsWritable(string $filename, string $message = ''): void
1165
    {
1166
        static::assertThat($filename, new IsWritable, $message);
1167
    }
1168
1169
    /**
1170
     * Asserts that a file/dir exists and is not writable.
1171
     *
1172
     * @throws ExpectationFailedException
1173
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1174
     */
1175
    public static function assertNotIsWritable(string $filename, string $message = ''): void
1176
    {
1177
        static::assertThat($filename, new LogicalNot(new IsWritable), $message);
1178
    }
1179
1180
    /**
1181
     * Asserts that a directory exists.
1182
     *
1183
     * @throws ExpectationFailedException
1184
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1185
     */
1186
    public static function assertDirectoryExists(string $directory, string $message = ''): void
1187
    {
1188
        static::assertThat($directory, new DirectoryExists, $message);
1189
    }
1190
1191
    /**
1192
     * Asserts that a directory does not exist.
1193
     *
1194
     * @throws ExpectationFailedException
1195
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1196
     */
1197
    public static function assertDirectoryNotExists(string $directory, string $message = ''): void
1198
    {
1199
        static::assertThat($directory, new LogicalNot(new DirectoryExists), $message);
1200
    }
1201
1202
    /**
1203
     * Asserts that a directory exists and is readable.
1204
     *
1205
     * @throws ExpectationFailedException
1206
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1207
     */
1208
    public static function assertDirectoryIsReadable(string $directory, string $message = ''): void
1209
    {
1210
        self::assertDirectoryExists($directory, $message);
1211
        self::assertIsReadable($directory, $message);
1212
    }
1213
1214
    /**
1215
     * Asserts that a directory exists and is not readable.
1216
     *
1217
     * @throws ExpectationFailedException
1218
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1219
     */
1220
    public static function assertDirectoryNotIsReadable(string $directory, string $message = ''): void
1221
    {
1222
        self::assertDirectoryExists($directory, $message);
1223
        self::assertNotIsReadable($directory, $message);
1224
    }
1225
1226
    /**
1227
     * Asserts that a directory exists and is writable.
1228
     *
1229
     * @throws ExpectationFailedException
1230
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1231
     */
1232
    public static function assertDirectoryIsWritable(string $directory, string $message = ''): void
1233
    {
1234
        self::assertDirectoryExists($directory, $message);
1235
        self::assertIsWritable($directory, $message);
1236
    }
1237
1238
    /**
1239
     * Asserts that a directory exists and is not writable.
1240
     *
1241
     * @throws ExpectationFailedException
1242
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1243
     */
1244
    public static function assertDirectoryNotIsWritable(string $directory, string $message = ''): void
1245
    {
1246
        self::assertDirectoryExists($directory, $message);
1247
        self::assertNotIsWritable($directory, $message);
1248
    }
1249
1250
    /**
1251
     * Asserts that a file exists.
1252
     *
1253
     * @throws ExpectationFailedException
1254
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1255
     */
1256
    public static function assertFileExists(string $filename, string $message = ''): void
1257
    {
1258
        static::assertThat($filename, new FileExists, $message);
1259
    }
1260
1261
    /**
1262
     * Asserts that a file does not exist.
1263
     *
1264
     * @throws ExpectationFailedException
1265
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1266
     */
1267
    public static function assertFileNotExists(string $filename, string $message = ''): void
1268
    {
1269
        static::assertThat($filename, new LogicalNot(new FileExists), $message);
1270
    }
1271
1272
    /**
1273
     * Asserts that a file exists and is readable.
1274
     *
1275
     * @throws ExpectationFailedException
1276
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1277
     */
1278
    public static function assertFileIsReadable(string $file, string $message = ''): void
1279
    {
1280
        self::assertFileExists($file, $message);
1281
        self::assertIsReadable($file, $message);
1282
    }
1283
1284
    /**
1285
     * Asserts that a file exists and is not readable.
1286
     *
1287
     * @throws ExpectationFailedException
1288
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1289
     */
1290
    public static function assertFileNotIsReadable(string $file, string $message = ''): void
1291
    {
1292
        self::assertFileExists($file, $message);
1293
        self::assertNotIsReadable($file, $message);
1294
    }
1295
1296
    /**
1297
     * Asserts that a file exists and is writable.
1298
     *
1299
     * @throws ExpectationFailedException
1300
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1301
     */
1302
    public static function assertFileIsWritable(string $file, string $message = ''): void
1303
    {
1304
        self::assertFileExists($file, $message);
1305
        self::assertIsWritable($file, $message);
1306
    }
1307
1308
    /**
1309
     * Asserts that a file exists and is not writable.
1310
     *
1311
     * @throws ExpectationFailedException
1312
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1313
     */
1314
    public static function assertFileNotIsWritable(string $file, string $message = ''): void
1315
    {
1316
        self::assertFileExists($file, $message);
1317
        self::assertNotIsWritable($file, $message);
1318
    }
1319
1320
    /**
1321
     * Asserts that a condition is true.
1322
     *
1323
     * @throws ExpectationFailedException
1324
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1325
     */
1326
    public static function assertTrue($condition, string $message = ''): void
1327
    {
1328
        static::assertThat($condition, static::isTrue(), $message);
1329
    }
1330
1331
    /**
1332
     * Asserts that a condition is not true.
1333
     *
1334
     * @throws ExpectationFailedException
1335
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1336
     */
1337
    public static function assertNotTrue($condition, string $message = ''): void
1338
    {
1339
        static::assertThat($condition, static::logicalNot(static::isTrue()), $message);
1340
    }
1341
1342
    /**
1343
     * Asserts that a condition is false.
1344
     *
1345
     * @throws ExpectationFailedException
1346
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1347
     */
1348
    public static function assertFalse($condition, string $message = ''): void
1349
    {
1350
        static::assertThat($condition, static::isFalse(), $message);
1351
    }
1352
1353
    /**
1354
     * Asserts that a condition is not false.
1355
     *
1356
     * @throws ExpectationFailedException
1357
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1358
     */
1359
    public static function assertNotFalse($condition, string $message = ''): void
1360
    {
1361
        static::assertThat($condition, static::logicalNot(static::isFalse()), $message);
1362
    }
1363
1364
    /**
1365
     * Asserts that a variable is null.
1366
     *
1367
     * @throws ExpectationFailedException
1368
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1369
     */
1370
    public static function assertNull($actual, string $message = ''): void
1371
    {
1372
        static::assertThat($actual, static::isNull(), $message);
1373
    }
1374
1375
    /**
1376
     * Asserts that a variable is not null.
1377
     *
1378
     * @throws ExpectationFailedException
1379
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1380
     */
1381
    public static function assertNotNull($actual, string $message = ''): void
1382
    {
1383
        static::assertThat($actual, static::logicalNot(static::isNull()), $message);
1384
    }
1385
1386
    /**
1387
     * Asserts that a variable is finite.
1388
     *
1389
     * @throws ExpectationFailedException
1390
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1391
     */
1392
    public static function assertFinite($actual, string $message = ''): void
1393
    {
1394
        static::assertThat($actual, static::isFinite(), $message);
1395
    }
1396
1397
    /**
1398
     * Asserts that a variable is infinite.
1399
     *
1400
     * @throws ExpectationFailedException
1401
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1402
     */
1403
    public static function assertInfinite($actual, string $message = ''): void
1404
    {
1405
        static::assertThat($actual, static::isInfinite(), $message);
1406
    }
1407
1408
    /**
1409
     * Asserts that a variable is nan.
1410
     *
1411
     * @throws ExpectationFailedException
1412
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1413
     */
1414
    public static function assertNan($actual, string $message = ''): void
1415
    {
1416
        static::assertThat($actual, static::isNan(), $message);
1417
    }
1418
1419
    /**
1420
     * Asserts that a class has a specified attribute.
1421
     *
1422
     * @throws ExpectationFailedException
1423
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1424
     * @throws Exception
1425
     */
1426
    public static function assertClassHasAttribute(string $attributeName, string $className, string $message = ''): void
1427
    {
1428
        if (!self::isValidClassAttributeName($attributeName)) {
1429
            throw InvalidArgumentHelper::factory(1, 'valid attribute name');
1430
        }
1431
1432
        if (!\class_exists($className)) {
1433
            throw InvalidArgumentHelper::factory(2, 'class name', $className);
1434
        }
1435
1436
        static::assertThat($className, new ClassHasAttribute($attributeName), $message);
1437
    }
1438
1439
    /**
1440
     * Asserts that a class does not have a specified attribute.
1441
     *
1442
     * @throws ExpectationFailedException
1443
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1444
     * @throws Exception
1445
     */
1446
    public static function assertClassNotHasAttribute(string $attributeName, string $className, string $message = ''): void
1447
    {
1448
        if (!self::isValidClassAttributeName($attributeName)) {
1449
            throw InvalidArgumentHelper::factory(1, 'valid attribute name');
1450
        }
1451
1452
        if (!\class_exists($className)) {
1453
            throw InvalidArgumentHelper::factory(2, 'class name', $className);
1454
        }
1455
1456
        static::assertThat(
1457
            $className,
1458
            new LogicalNot(
1459
                new ClassHasAttribute($attributeName)
1460
            ),
1461
            $message
1462
        );
1463
    }
1464
1465
    /**
1466
     * Asserts that a class has a specified static attribute.
1467
     *
1468
     * @throws ExpectationFailedException
1469
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1470
     * @throws Exception
1471
     */
1472
    public static function assertClassHasStaticAttribute(string $attributeName, string $className, string $message = ''): void
1473
    {
1474
        if (!self::isValidClassAttributeName($attributeName)) {
1475
            throw InvalidArgumentHelper::factory(1, 'valid attribute name');
1476
        }
1477
1478
        if (!\class_exists($className)) {
1479
            throw InvalidArgumentHelper::factory(2, 'class name', $className);
1480
        }
1481
1482
        static::assertThat(
1483
            $className,
1484
            new ClassHasStaticAttribute($attributeName),
1485
            $message
1486
        );
1487
    }
1488
1489
    /**
1490
     * Asserts that a class does not have a specified static attribute.
1491
     *
1492
     * @throws ExpectationFailedException
1493
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1494
     * @throws Exception
1495
     */
1496
    public static function assertClassNotHasStaticAttribute(string $attributeName, string $className, string $message = ''): void
1497
    {
1498
        if (!self::isValidClassAttributeName($attributeName)) {
1499
            throw InvalidArgumentHelper::factory(1, 'valid attribute name');
1500
        }
1501
1502
        if (!\class_exists($className)) {
1503
            throw InvalidArgumentHelper::factory(2, 'class name', $className);
1504
        }
1505
1506
        static::assertThat(
1507
            $className,
1508
            new LogicalNot(
1509
                new ClassHasStaticAttribute($attributeName)
1510
            ),
1511
            $message
1512
        );
1513
    }
1514
1515
    /**
1516
     * Asserts that an object has a specified attribute.
1517
     *
1518
     * @param object $object
1519
     *
1520
     * @throws ExpectationFailedException
1521
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1522
     * @throws Exception
1523
     */
1524
    public static function assertObjectHasAttribute(string $attributeName, $object, string $message = ''): void
1525
    {
1526
        if (!self::isValidObjectAttributeName($attributeName)) {
1527
            throw InvalidArgumentHelper::factory(1, 'valid attribute name');
1528
        }
1529
1530
        if (!\is_object($object)) {
1531
            throw InvalidArgumentHelper::factory(2, 'object');
1532
        }
1533
1534
        static::assertThat(
1535
            $object,
1536
            new ObjectHasAttribute($attributeName),
1537
            $message
1538
        );
1539
    }
1540
1541
    /**
1542
     * Asserts that an object does not have a specified attribute.
1543
     *
1544
     * @param object $object
1545
     *
1546
     * @throws ExpectationFailedException
1547
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1548
     * @throws Exception
1549
     */
1550
    public static function assertObjectNotHasAttribute(string $attributeName, $object, string $message = ''): void
1551
    {
1552
        if (!self::isValidObjectAttributeName($attributeName)) {
1553
            throw InvalidArgumentHelper::factory(1, 'valid attribute name');
1554
        }
1555
1556
        if (!\is_object($object)) {
1557
            throw InvalidArgumentHelper::factory(2, 'object');
1558
        }
1559
1560
        static::assertThat(
1561
            $object,
1562
            new LogicalNot(
1563
                new ObjectHasAttribute($attributeName)
1564
            ),
1565
            $message
1566
        );
1567
    }
1568
1569
    /**
1570
     * Asserts that two variables have the same type and value.
1571
     * Used on objects, it asserts that two variables reference
1572
     * the same object.
1573
     *
1574
     * @throws ExpectationFailedException
1575
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1576
     */
1577
    public static function assertSame($expected, $actual, string $message = ''): void
1578
    {
1579
        static::assertThat(
1580
            $actual,
1581
            new IsIdentical($expected),
1582
            $message
1583
        );
1584
    }
1585
1586
    /**
1587
     * Asserts that a variable and an attribute of an object have the same type
1588
     * and value.
1589
     *
1590
     * @param object|string $actualClassOrObject
1591
     *
1592
     * @throws ExpectationFailedException
1593
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1594
     * @throws ReflectionException
1595
     * @throws Exception
1596
     *
1597
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
1598
     * @codeCoverageIgnore
1599
     */
1600
    public static function assertAttributeSame($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void
1601
    {
1602
        self::createWarning('assertAttributeSame() is deprecated and will be removed in PHPUnit 9.');
1603
1604
        static::assertSame(
1605
            $expected,
1606
            static::readAttribute($actualClassOrObject, $actualAttributeName),
1607
            $message
1608
        );
1609
    }
1610
1611
    /**
1612
     * Asserts that two variables do not have the same type and value.
1613
     * Used on objects, it asserts that two variables do not reference
1614
     * the same object.
1615
     *
1616
     * @throws ExpectationFailedException
1617
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1618
     */
1619
    public static function assertNotSame($expected, $actual, string $message = ''): void
1620
    {
1621
        if (\is_bool($expected) && \is_bool($actual)) {
1622
            static::assertNotEquals($expected, $actual, $message);
1623
        }
1624
1625
        static::assertThat(
1626
            $actual,
1627
            new LogicalNot(
1628
                new IsIdentical($expected)
1629
            ),
1630
            $message
1631
        );
1632
    }
1633
1634
    /**
1635
     * Asserts that a variable and an attribute of an object do not have the
1636
     * same type and value.
1637
     *
1638
     * @param object|string $actualClassOrObject
1639
     *
1640
     * @throws ExpectationFailedException
1641
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1642
     * @throws ReflectionException
1643
     * @throws Exception
1644
     *
1645
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
1646
     * @codeCoverageIgnore
1647
     */
1648
    public static function assertAttributeNotSame($expected, string $actualAttributeName, $actualClassOrObject, string $message = ''): void
1649
    {
1650
        self::createWarning('assertAttributeNotSame() is deprecated and will be removed in PHPUnit 9.');
1651
1652
        static::assertNotSame(
1653
            $expected,
1654
            static::readAttribute($actualClassOrObject, $actualAttributeName),
1655
            $message
1656
        );
1657
    }
1658
1659
    /**
1660
     * Asserts that a variable is of a given type.
1661
     *
1662
     * @throws ExpectationFailedException
1663
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1664
     * @throws Exception
1665
     */
1666
    public static function assertInstanceOf(string $expected, $actual, string $message = ''): void
1667
    {
1668
        if (!\class_exists($expected) && !\interface_exists($expected)) {
1669
            throw InvalidArgumentHelper::factory(1, 'class or interface name');
1670
        }
1671
1672
        static::assertThat(
1673
            $actual,
1674
            new IsInstanceOf($expected),
1675
            $message
1676
        );
1677
    }
1678
1679
    /**
1680
     * Asserts that an attribute is of a given type.
1681
     *
1682
     * @param object|string $classOrObject
1683
     *
1684
     * @throws ExpectationFailedException
1685
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1686
     * @throws ReflectionException
1687
     * @throws Exception
1688
     *
1689
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
1690
     * @codeCoverageIgnore
1691
     */
1692
    public static function assertAttributeInstanceOf(string $expected, string $attributeName, $classOrObject, string $message = ''): void
1693
    {
1694
        self::createWarning('assertAttributeInstanceOf() is deprecated and will be removed in PHPUnit 9.');
1695
1696
        static::assertInstanceOf(
1697
            $expected,
1698
            static::readAttribute($classOrObject, $attributeName),
1699
            $message
1700
        );
1701
    }
1702
1703
    /**
1704
     * Asserts that a variable is not of a given type.
1705
     *
1706
     * @throws ExpectationFailedException
1707
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1708
     * @throws Exception
1709
     */
1710
    public static function assertNotInstanceOf(string $expected, $actual, string $message = ''): void
1711
    {
1712
        if (!\class_exists($expected) && !\interface_exists($expected)) {
1713
            throw InvalidArgumentHelper::factory(1, 'class or interface name');
1714
        }
1715
1716
        static::assertThat(
1717
            $actual,
1718
            new LogicalNot(
1719
                new IsInstanceOf($expected)
1720
            ),
1721
            $message
1722
        );
1723
    }
1724
1725
    /**
1726
     * Asserts that an attribute is of a given type.
1727
     *
1728
     * @param object|string $classOrObject
1729
     *
1730
     * @throws ExpectationFailedException
1731
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1732
     * @throws ReflectionException
1733
     * @throws Exception
1734
     *
1735
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
1736
     * @codeCoverageIgnore
1737
     */
1738
    public static function assertAttributeNotInstanceOf(string $expected, string $attributeName, $classOrObject, string $message = ''): void
1739
    {
1740
        self::createWarning('assertAttributeNotInstanceOf() is deprecated and will be removed in PHPUnit 9.');
1741
1742
        static::assertNotInstanceOf(
1743
            $expected,
1744
            static::readAttribute($classOrObject, $attributeName),
1745
            $message
1746
        );
1747
    }
1748
1749
    /**
1750
     * Asserts that a variable is of a given type.
1751
     *
1752
     * @throws ExpectationFailedException
1753
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1754
     *
1755
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3369
1756
     * @codeCoverageIgnore
1757
     */
1758
    public static function assertInternalType(string $expected, $actual, string $message = ''): void
1759
    {
1760
        self::createWarning('assertInternalType() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertIsArray(), assertIsBool(), assertIsFloat(), assertIsInt(), assertIsNumeric(), assertIsObject(), assertIsResource(), assertIsString(), assertIsScalar(), assertIsCallable(), or assertIsIterable() instead.');
1761
1762
        static::assertThat(
1763
            $actual,
1764
            new IsType($expected),
1765
            $message
1766
        );
1767
    }
1768
1769
    /**
1770
     * Asserts that an attribute is of a given type.
1771
     *
1772
     * @param object|string $classOrObject
1773
     *
1774
     * @throws ExpectationFailedException
1775
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1776
     * @throws ReflectionException
1777
     * @throws Exception
1778
     *
1779
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
1780
     * @codeCoverageIgnore
1781
     */
1782
    public static function assertAttributeInternalType(string $expected, string $attributeName, $classOrObject, string $message = ''): void
1783
    {
1784
        self::createWarning('assertAttributeInternalType() is deprecated and will be removed in PHPUnit 9.');
1785
1786
        static::assertInternalType(
1787
            $expected,
1788
            static::readAttribute($classOrObject, $attributeName),
1789
            $message
1790
        );
1791
    }
1792
1793
    /**
1794
     * Asserts that a variable is of type array.
1795
     *
1796
     * @throws ExpectationFailedException
1797
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1798
     */
1799
    public static function assertIsArray($actual, string $message = ''): void
1800
    {
1801
        static::assertThat(
1802
            $actual,
1803
            new IsType(IsType::TYPE_ARRAY),
1804
            $message
1805
        );
1806
    }
1807
1808
    /**
1809
     * Asserts that a variable is of type bool.
1810
     *
1811
     * @throws ExpectationFailedException
1812
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1813
     */
1814
    public static function assertIsBool($actual, string $message = ''): void
1815
    {
1816
        static::assertThat(
1817
            $actual,
1818
            new IsType(IsType::TYPE_BOOL),
1819
            $message
1820
        );
1821
    }
1822
1823
    /**
1824
     * Asserts that a variable is of type float.
1825
     *
1826
     * @throws ExpectationFailedException
1827
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1828
     */
1829
    public static function assertIsFloat($actual, string $message = ''): void
1830
    {
1831
        static::assertThat(
1832
            $actual,
1833
            new IsType(IsType::TYPE_FLOAT),
1834
            $message
1835
        );
1836
    }
1837
1838
    /**
1839
     * Asserts that a variable is of type int.
1840
     *
1841
     * @throws ExpectationFailedException
1842
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1843
     */
1844
    public static function assertIsInt($actual, string $message = ''): void
1845
    {
1846
        static::assertThat(
1847
            $actual,
1848
            new IsType(IsType::TYPE_INT),
1849
            $message
1850
        );
1851
    }
1852
1853
    /**
1854
     * Asserts that a variable is of type numeric.
1855
     *
1856
     * @throws ExpectationFailedException
1857
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1858
     */
1859
    public static function assertIsNumeric($actual, string $message = ''): void
1860
    {
1861
        static::assertThat(
1862
            $actual,
1863
            new IsType(IsType::TYPE_NUMERIC),
1864
            $message
1865
        );
1866
    }
1867
1868
    /**
1869
     * Asserts that a variable is of type object.
1870
     *
1871
     * @throws ExpectationFailedException
1872
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1873
     */
1874
    public static function assertIsObject($actual, string $message = ''): void
1875
    {
1876
        static::assertThat(
1877
            $actual,
1878
            new IsType(IsType::TYPE_OBJECT),
1879
            $message
1880
        );
1881
    }
1882
1883
    /**
1884
     * Asserts that a variable is of type resource.
1885
     *
1886
     * @throws ExpectationFailedException
1887
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1888
     */
1889
    public static function assertIsResource($actual, string $message = ''): void
1890
    {
1891
        static::assertThat(
1892
            $actual,
1893
            new IsType(IsType::TYPE_RESOURCE),
1894
            $message
1895
        );
1896
    }
1897
1898
    /**
1899
     * Asserts that a variable is of type string.
1900
     *
1901
     * @throws ExpectationFailedException
1902
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1903
     */
1904
    public static function assertIsString($actual, string $message = ''): void
1905
    {
1906
        static::assertThat(
1907
            $actual,
1908
            new IsType(IsType::TYPE_STRING),
1909
            $message
1910
        );
1911
    }
1912
1913
    /**
1914
     * Asserts that a variable is of type scalar.
1915
     *
1916
     * @throws ExpectationFailedException
1917
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1918
     */
1919
    public static function assertIsScalar($actual, string $message = ''): void
1920
    {
1921
        static::assertThat(
1922
            $actual,
1923
            new IsType(IsType::TYPE_SCALAR),
1924
            $message
1925
        );
1926
    }
1927
1928
    /**
1929
     * Asserts that a variable is of type callable.
1930
     *
1931
     * @throws ExpectationFailedException
1932
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1933
     */
1934
    public static function assertIsCallable($actual, string $message = ''): void
1935
    {
1936
        static::assertThat(
1937
            $actual,
1938
            new IsType(IsType::TYPE_CALLABLE),
1939
            $message
1940
        );
1941
    }
1942
1943
    /**
1944
     * Asserts that a variable is of type iterable.
1945
     *
1946
     * @throws ExpectationFailedException
1947
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1948
     */
1949
    public static function assertIsIterable($actual, string $message = ''): void
1950
    {
1951
        static::assertThat(
1952
            $actual,
1953
            new IsType(IsType::TYPE_ITERABLE),
1954
            $message
1955
        );
1956
    }
1957
1958
    /**
1959
     * Asserts that a variable is not of a given type.
1960
     *
1961
     * @throws ExpectationFailedException
1962
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1963
     *
1964
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3369
1965
     * @codeCoverageIgnore
1966
     */
1967
    public static function assertNotInternalType(string $expected, $actual, string $message = ''): void
1968
    {
1969
        self::createWarning('assertNotInternalType() is deprecated and will be removed in PHPUnit 9. Refactor your test to use assertIsNotArray(), assertIsNotBool(), assertIsNotFloat(), assertIsNotInt(), assertIsNotNumeric(), assertIsNotObject(), assertIsNotResource(), assertIsNotString(), assertIsNotScalar(), assertIsNotCallable(), or assertIsNotIterable() instead.');
1970
1971
        static::assertThat(
1972
            $actual,
1973
            new LogicalNot(
1974
                new IsType($expected)
1975
            ),
1976
            $message
1977
        );
1978
    }
1979
1980
    /**
1981
     * Asserts that a variable is not of type array.
1982
     *
1983
     * @throws ExpectationFailedException
1984
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
1985
     */
1986
    public static function assertIsNotArray($actual, string $message = ''): void
1987
    {
1988
        static::assertThat(
1989
            $actual,
1990
            new LogicalNot(new IsType(IsType::TYPE_ARRAY)),
1991
            $message
1992
        );
1993
    }
1994
1995
    /**
1996
     * Asserts that a variable is not of type bool.
1997
     *
1998
     * @throws ExpectationFailedException
1999
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2000
     */
2001
    public static function assertIsNotBool($actual, string $message = ''): void
2002
    {
2003
        static::assertThat(
2004
            $actual,
2005
            new LogicalNot(new IsType(IsType::TYPE_BOOL)),
2006
            $message
2007
        );
2008
    }
2009
2010
    /**
2011
     * Asserts that a variable is not of type float.
2012
     *
2013
     * @throws ExpectationFailedException
2014
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2015
     */
2016
    public static function assertIsNotFloat($actual, string $message = ''): void
2017
    {
2018
        static::assertThat(
2019
            $actual,
2020
            new LogicalNot(new IsType(IsType::TYPE_FLOAT)),
2021
            $message
2022
        );
2023
    }
2024
2025
    /**
2026
     * Asserts that a variable is not of type int.
2027
     *
2028
     * @throws ExpectationFailedException
2029
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2030
     */
2031
    public static function assertIsNotInt($actual, string $message = ''): void
2032
    {
2033
        static::assertThat(
2034
            $actual,
2035
            new LogicalNot(new IsType(IsType::TYPE_INT)),
2036
            $message
2037
        );
2038
    }
2039
2040
    /**
2041
     * Asserts that a variable is not of type numeric.
2042
     *
2043
     * @throws ExpectationFailedException
2044
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2045
     */
2046
    public static function assertIsNotNumeric($actual, string $message = ''): void
2047
    {
2048
        static::assertThat(
2049
            $actual,
2050
            new LogicalNot(new IsType(IsType::TYPE_NUMERIC)),
2051
            $message
2052
        );
2053
    }
2054
2055
    /**
2056
     * Asserts that a variable is not of type object.
2057
     *
2058
     * @throws ExpectationFailedException
2059
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2060
     */
2061
    public static function assertIsNotObject($actual, string $message = ''): void
2062
    {
2063
        static::assertThat(
2064
            $actual,
2065
            new LogicalNot(new IsType(IsType::TYPE_OBJECT)),
2066
            $message
2067
        );
2068
    }
2069
2070
    /**
2071
     * Asserts that a variable is not of type resource.
2072
     *
2073
     * @throws ExpectationFailedException
2074
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2075
     */
2076
    public static function assertIsNotResource($actual, string $message = ''): void
2077
    {
2078
        static::assertThat(
2079
            $actual,
2080
            new LogicalNot(new IsType(IsType::TYPE_RESOURCE)),
2081
            $message
2082
        );
2083
    }
2084
2085
    /**
2086
     * Asserts that a variable is not of type string.
2087
     *
2088
     * @throws ExpectationFailedException
2089
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2090
     */
2091
    public static function assertIsNotString($actual, string $message = ''): void
2092
    {
2093
        static::assertThat(
2094
            $actual,
2095
            new LogicalNot(new IsType(IsType::TYPE_STRING)),
2096
            $message
2097
        );
2098
    }
2099
2100
    /**
2101
     * Asserts that a variable is not of type scalar.
2102
     *
2103
     * @throws ExpectationFailedException
2104
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2105
     */
2106
    public static function assertIsNotScalar($actual, string $message = ''): void
2107
    {
2108
        static::assertThat(
2109
            $actual,
2110
            new LogicalNot(new IsType(IsType::TYPE_SCALAR)),
2111
            $message
2112
        );
2113
    }
2114
2115
    /**
2116
     * Asserts that a variable is not of type callable.
2117
     *
2118
     * @throws ExpectationFailedException
2119
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2120
     */
2121
    public static function assertIsNotCallable($actual, string $message = ''): void
2122
    {
2123
        static::assertThat(
2124
            $actual,
2125
            new LogicalNot(new IsType(IsType::TYPE_CALLABLE)),
2126
            $message
2127
        );
2128
    }
2129
2130
    /**
2131
     * Asserts that a variable is not of type iterable.
2132
     *
2133
     * @throws ExpectationFailedException
2134
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2135
     */
2136
    public static function assertIsNotIterable($actual, string $message = ''): void
2137
    {
2138
        static::assertThat(
2139
            $actual,
2140
            new LogicalNot(new IsType(IsType::TYPE_ITERABLE)),
2141
            $message
2142
        );
2143
    }
2144
2145
    /**
2146
     * Asserts that an attribute is of a given type.
2147
     *
2148
     * @param object|string $classOrObject
2149
     *
2150
     * @throws ExpectationFailedException
2151
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2152
     * @throws ReflectionException
2153
     * @throws Exception
2154
     *
2155
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
2156
     * @codeCoverageIgnore
2157
     */
2158
    public static function assertAttributeNotInternalType(string $expected, string $attributeName, $classOrObject, string $message = ''): void
2159
    {
2160
        self::createWarning('assertAttributeNotInternalType() is deprecated and will be removed in PHPUnit 9.');
2161
2162
        static::assertNotInternalType(
2163
            $expected,
2164
            static::readAttribute($classOrObject, $attributeName),
2165
            $message
2166
        );
2167
    }
2168
2169
    /**
2170
     * Asserts that a string matches a given regular expression.
2171
     *
2172
     * @throws ExpectationFailedException
2173
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2174
     */
2175
    public static function assertRegExp(string $pattern, string $string, string $message = ''): void
2176
    {
2177
        static::assertThat($string, new RegularExpression($pattern), $message);
2178
    }
2179
2180
    /**
2181
     * Asserts that a string does not match a given regular expression.
2182
     *
2183
     * @throws ExpectationFailedException
2184
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2185
     */
2186
    public static function assertNotRegExp(string $pattern, string $string, string $message = ''): void
2187
    {
2188
        static::assertThat(
2189
            $string,
2190
            new LogicalNot(
2191
                new RegularExpression($pattern)
2192
            ),
2193
            $message
2194
        );
2195
    }
2196
2197
    /**
2198
     * Assert that the size of two arrays (or `Countable` or `Traversable` objects)
2199
     * is the same.
2200
     *
2201
     * @param Countable|iterable $expected
2202
     * @param Countable|iterable $actual
2203
     *
2204
     * @throws ExpectationFailedException
2205
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2206
     * @throws Exception
2207
     */
2208
    public static function assertSameSize($expected, $actual, string $message = ''): void
2209
    {
2210
        if (!$expected instanceof Countable && !\is_iterable($expected)) {
2211
            throw InvalidArgumentHelper::factory(1, 'countable or iterable');
2212
        }
2213
2214
        if (!$actual instanceof Countable && !\is_iterable($actual)) {
2215
            throw InvalidArgumentHelper::factory(2, 'countable or iterable');
2216
        }
2217
2218
        static::assertThat(
2219
            $actual,
2220
            new SameSize($expected),
2221
            $message
2222
        );
2223
    }
2224
2225
    /**
2226
     * Assert that the size of two arrays (or `Countable` or `Traversable` objects)
2227
     * is not the same.
2228
     *
2229
     * @param Countable|iterable $expected
2230
     * @param Countable|iterable $actual
2231
     *
2232
     * @throws ExpectationFailedException
2233
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2234
     * @throws Exception
2235
     */
2236
    public static function assertNotSameSize($expected, $actual, string $message = ''): void
2237
    {
2238
        if (!$expected instanceof Countable && !\is_iterable($expected)) {
2239
            throw InvalidArgumentHelper::factory(1, 'countable or iterable');
2240
        }
2241
2242
        if (!$actual instanceof Countable && !\is_iterable($actual)) {
2243
            throw InvalidArgumentHelper::factory(2, 'countable or iterable');
2244
        }
2245
2246
        static::assertThat(
2247
            $actual,
2248
            new LogicalNot(
2249
                new SameSize($expected)
2250
            ),
2251
            $message
2252
        );
2253
    }
2254
2255
    /**
2256
     * Asserts that a string matches a given format string.
2257
     *
2258
     * @throws ExpectationFailedException
2259
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2260
     */
2261
    public static function assertStringMatchesFormat(string $format, string $string, string $message = ''): void
2262
    {
2263
        static::assertThat($string, new StringMatchesFormatDescription($format), $message);
2264
    }
2265
2266
    /**
2267
     * Asserts that a string does not match a given format string.
2268
     *
2269
     * @throws ExpectationFailedException
2270
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2271
     */
2272
    public static function assertStringNotMatchesFormat(string $format, string $string, string $message = ''): void
2273
    {
2274
        static::assertThat(
2275
            $string,
2276
            new LogicalNot(
2277
                new StringMatchesFormatDescription($format)
2278
            ),
2279
            $message
2280
        );
2281
    }
2282
2283
    /**
2284
     * Asserts that a string matches a given format file.
2285
     *
2286
     * @throws ExpectationFailedException
2287
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2288
     */
2289
    public static function assertStringMatchesFormatFile(string $formatFile, string $string, string $message = ''): void
2290
    {
2291
        static::assertFileExists($formatFile, $message);
2292
2293
        static::assertThat(
2294
            $string,
2295
            new StringMatchesFormatDescription(
2296
                \file_get_contents($formatFile)
2297
            ),
2298
            $message
2299
        );
2300
    }
2301
2302
    /**
2303
     * Asserts that a string does not match a given format string.
2304
     *
2305
     * @throws ExpectationFailedException
2306
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2307
     */
2308
    public static function assertStringNotMatchesFormatFile(string $formatFile, string $string, string $message = ''): void
2309
    {
2310
        static::assertFileExists($formatFile, $message);
2311
2312
        static::assertThat(
2313
            $string,
2314
            new LogicalNot(
2315
                new StringMatchesFormatDescription(
2316
                    \file_get_contents($formatFile)
2317
                )
2318
            ),
2319
            $message
2320
        );
2321
    }
2322
2323
    /**
2324
     * Asserts that a string starts with a given prefix.
2325
     *
2326
     * @throws ExpectationFailedException
2327
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2328
     */
2329
    public static function assertStringStartsWith(string $prefix, string $string, string $message = ''): void
2330
    {
2331
        static::assertThat($string, new StringStartsWith($prefix), $message);
2332
    }
2333
2334
    /**
2335
     * Asserts that a string starts not with a given prefix.
2336
     *
2337
     * @param string $prefix
2338
     * @param string $string
2339
     *
2340
     * @throws ExpectationFailedException
2341
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2342
     */
2343
    public static function assertStringStartsNotWith($prefix, $string, string $message = ''): void
2344
    {
2345
        static::assertThat(
2346
            $string,
2347
            new LogicalNot(
2348
                new StringStartsWith($prefix)
2349
            ),
2350
            $message
2351
        );
2352
    }
2353
2354
    /**
2355
     * @throws ExpectationFailedException
2356
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2357
     */
2358
    public static function assertStringContainsString(string $needle, string $haystack, string $message = ''): void
2359
    {
2360
        $constraint = new StringContains($needle, false);
2361
2362
        static::assertThat($haystack, $constraint, $message);
2363
    }
2364
2365
    /**
2366
     * @throws ExpectationFailedException
2367
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2368
     */
2369
    public static function assertStringContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void
2370
    {
2371
        $constraint = new StringContains($needle, true);
2372
2373
        static::assertThat($haystack, $constraint, $message);
2374
    }
2375
2376
    /**
2377
     * @throws ExpectationFailedException
2378
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2379
     */
2380
    public static function assertStringNotContainsString(string $needle, string $haystack, string $message = ''): void
2381
    {
2382
        $constraint = new LogicalNot(new StringContains($needle));
2383
2384
        static::assertThat($haystack, $constraint, $message);
2385
    }
2386
2387
    /**
2388
     * @throws ExpectationFailedException
2389
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2390
     */
2391
    public static function assertStringNotContainsStringIgnoringCase(string $needle, string $haystack, string $message = ''): void
2392
    {
2393
        $constraint = new LogicalNot(new StringContains($needle, true));
2394
2395
        static::assertThat($haystack, $constraint, $message);
2396
    }
2397
2398
    /**
2399
     * Asserts that a string ends with a given suffix.
2400
     *
2401
     * @throws ExpectationFailedException
2402
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2403
     */
2404
    public static function assertStringEndsWith(string $suffix, string $string, string $message = ''): void
2405
    {
2406
        static::assertThat($string, new StringEndsWith($suffix), $message);
2407
    }
2408
2409
    /**
2410
     * Asserts that a string ends not with a given suffix.
2411
     *
2412
     * @throws ExpectationFailedException
2413
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2414
     */
2415
    public static function assertStringEndsNotWith(string $suffix, string $string, string $message = ''): void
2416
    {
2417
        static::assertThat(
2418
            $string,
2419
            new LogicalNot(
2420
                new StringEndsWith($suffix)
2421
            ),
2422
            $message
2423
        );
2424
    }
2425
2426
    /**
2427
     * Asserts that two XML files are equal.
2428
     *
2429
     * @throws ExpectationFailedException
2430
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2431
     * @throws Exception
2432
     */
2433
    public static function assertXmlFileEqualsXmlFile(string $expectedFile, string $actualFile, string $message = ''): void
2434
    {
2435
        $expected = Xml::loadFile($expectedFile);
2436
        $actual   = Xml::loadFile($actualFile);
2437
2438
        static::assertEquals($expected, $actual, $message);
2439
    }
2440
2441
    /**
2442
     * Asserts that two XML files are not equal.
2443
     *
2444
     * @throws ExpectationFailedException
2445
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2446
     * @throws Exception
2447
     */
2448
    public static function assertXmlFileNotEqualsXmlFile(string $expectedFile, string $actualFile, string $message = ''): void
2449
    {
2450
        $expected = Xml::loadFile($expectedFile);
2451
        $actual   = Xml::loadFile($actualFile);
2452
2453
        static::assertNotEquals($expected, $actual, $message);
2454
    }
2455
2456
    /**
2457
     * Asserts that two XML documents are equal.
2458
     *
2459
     * @param DOMDocument|string $actualXml
2460
     *
2461
     * @throws ExpectationFailedException
2462
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2463
     * @throws Exception
2464
     */
2465
    public static function assertXmlStringEqualsXmlFile(string $expectedFile, $actualXml, string $message = ''): void
2466
    {
2467
        $expected = Xml::loadFile($expectedFile);
2468
        $actual   = Xml::load($actualXml);
2469
2470
        static::assertEquals($expected, $actual, $message);
2471
    }
2472
2473
    /**
2474
     * Asserts that two XML documents are not equal.
2475
     *
2476
     * @param DOMDocument|string $actualXml
2477
     *
2478
     * @throws ExpectationFailedException
2479
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2480
     * @throws Exception
2481
     */
2482
    public static function assertXmlStringNotEqualsXmlFile(string $expectedFile, $actualXml, string $message = ''): void
2483
    {
2484
        $expected = Xml::loadFile($expectedFile);
2485
        $actual   = Xml::load($actualXml);
2486
2487
        static::assertNotEquals($expected, $actual, $message);
2488
    }
2489
2490
    /**
2491
     * Asserts that two XML documents are equal.
2492
     *
2493
     * @param DOMDocument|string $expectedXml
2494
     * @param DOMDocument|string $actualXml
2495
     *
2496
     * @throws ExpectationFailedException
2497
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2498
     * @throws Exception
2499
     */
2500
    public static function assertXmlStringEqualsXmlString($expectedXml, $actualXml, string $message = ''): void
2501
    {
2502
        $expected = Xml::load($expectedXml);
2503
        $actual   = Xml::load($actualXml);
2504
2505
        static::assertEquals($expected, $actual, $message);
2506
    }
2507
2508
    /**
2509
     * Asserts that two XML documents are not equal.
2510
     *
2511
     * @param DOMDocument|string $expectedXml
2512
     * @param DOMDocument|string $actualXml
2513
     *
2514
     * @throws ExpectationFailedException
2515
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2516
     * @throws Exception
2517
     */
2518
    public static function assertXmlStringNotEqualsXmlString($expectedXml, $actualXml, string $message = ''): void
2519
    {
2520
        $expected = Xml::load($expectedXml);
2521
        $actual   = Xml::load($actualXml);
2522
2523
        static::assertNotEquals($expected, $actual, $message);
2524
    }
2525
2526
    /**
2527
     * Asserts that a hierarchy of DOMElements matches.
2528
     *
2529
     * @throws AssertionFailedError
2530
     * @throws ExpectationFailedException
2531
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2532
     */
2533
    public static function assertEqualXMLStructure(DOMElement $expectedElement, DOMElement $actualElement, bool $checkAttributes = false, string $message = ''): void
2534
    {
2535
        $expectedElement = Xml::import($expectedElement);
2536
        $actualElement   = Xml::import($actualElement);
2537
2538
        static::assertSame(
2539
            $expectedElement->tagName,
2540
            $actualElement->tagName,
2541
            $message
2542
        );
2543
2544
        if ($checkAttributes) {
2545
            static::assertSame(
2546
                $expectedElement->attributes->length,
2547
                $actualElement->attributes->length,
2548
                \sprintf(
2549
                    '%s%sNumber of attributes on node "%s" does not match',
2550
                    $message,
2551
                    !empty($message) ? "\n" : '',
2552
                    $expectedElement->tagName
2553
                )
2554
            );
2555
2556
            for ($i = 0; $i < $expectedElement->attributes->length; $i++) {
2557
                $expectedAttribute = $expectedElement->attributes->item($i);
2558
                $actualAttribute   = $actualElement->attributes->getNamedItem($expectedAttribute->name);
2559
2560
                \assert($expectedAttribute instanceof \DOMAttr);
2561
2562
                if (!$actualAttribute) {
2563
                    static::fail(
2564
                        \sprintf(
2565
                            '%s%sCould not find attribute "%s" on node "%s"',
2566
                            $message,
2567
                            !empty($message) ? "\n" : '',
2568
                            $expectedAttribute->name,
2569
                            $expectedElement->tagName
2570
                        )
2571
                    );
2572
                }
2573
            }
2574
        }
2575
2576
        Xml::removeCharacterDataNodes($expectedElement);
2577
        Xml::removeCharacterDataNodes($actualElement);
2578
2579
        static::assertSame(
2580
            $expectedElement->childNodes->length,
2581
            $actualElement->childNodes->length,
2582
            \sprintf(
2583
                '%s%sNumber of child nodes of "%s" differs',
2584
                $message,
2585
                !empty($message) ? "\n" : '',
2586
                $expectedElement->tagName
2587
            )
2588
        );
2589
2590
        for ($i = 0; $i < $expectedElement->childNodes->length; $i++) {
2591
            static::assertEqualXMLStructure(
2592
                $expectedElement->childNodes->item($i),
2593
                $actualElement->childNodes->item($i),
2594
                $checkAttributes,
2595
                $message
2596
            );
2597
        }
2598
    }
2599
2600
    /**
2601
     * Evaluates a PHPUnit\Framework\Constraint matcher object.
2602
     *
2603
     * @throws ExpectationFailedException
2604
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2605
     */
2606
    public static function assertThat($value, Constraint $constraint, string $message = ''): void
2607
    {
2608
        self::$count += \count($constraint);
2609
2610
        $constraint->evaluate($value, $message);
2611
    }
2612
2613
    /**
2614
     * Asserts that a string is a valid JSON string.
2615
     *
2616
     * @throws ExpectationFailedException
2617
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2618
     */
2619
    public static function assertJson(string $actualJson, string $message = ''): void
2620
    {
2621
        static::assertThat($actualJson, static::isJson(), $message);
2622
    }
2623
2624
    /**
2625
     * Asserts that two given JSON encoded objects or arrays are equal.
2626
     *
2627
     * @throws ExpectationFailedException
2628
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2629
     */
2630
    public static function assertJsonStringEqualsJsonString(string $expectedJson, string $actualJson, string $message = ''): void
2631
    {
2632
        static::assertJson($expectedJson, $message);
2633
        static::assertJson($actualJson, $message);
2634
2635
        static::assertThat($actualJson, new JsonMatches($expectedJson), $message);
2636
    }
2637
2638
    /**
2639
     * Asserts that two given JSON encoded objects or arrays are not equal.
2640
     *
2641
     * @param string $expectedJson
2642
     * @param string $actualJson
2643
     *
2644
     * @throws ExpectationFailedException
2645
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2646
     */
2647
    public static function assertJsonStringNotEqualsJsonString($expectedJson, $actualJson, string $message = ''): void
2648
    {
2649
        static::assertJson($expectedJson, $message);
2650
        static::assertJson($actualJson, $message);
2651
2652
        static::assertThat(
2653
            $actualJson,
2654
            new LogicalNot(
2655
                new JsonMatches($expectedJson)
2656
            ),
2657
            $message
2658
        );
2659
    }
2660
2661
    /**
2662
     * Asserts that the generated JSON encoded object and the content of the given file are equal.
2663
     *
2664
     * @throws ExpectationFailedException
2665
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2666
     */
2667
    public static function assertJsonStringEqualsJsonFile(string $expectedFile, string $actualJson, string $message = ''): void
2668
    {
2669
        static::assertFileExists($expectedFile, $message);
2670
        $expectedJson = \file_get_contents($expectedFile);
2671
2672
        static::assertJson($expectedJson, $message);
2673
        static::assertJson($actualJson, $message);
2674
2675
        static::assertThat($actualJson, new JsonMatches($expectedJson), $message);
2676
    }
2677
2678
    /**
2679
     * Asserts that the generated JSON encoded object and the content of the given file are not equal.
2680
     *
2681
     * @throws ExpectationFailedException
2682
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2683
     */
2684
    public static function assertJsonStringNotEqualsJsonFile(string $expectedFile, string $actualJson, string $message = ''): void
2685
    {
2686
        static::assertFileExists($expectedFile, $message);
2687
        $expectedJson = \file_get_contents($expectedFile);
2688
2689
        static::assertJson($expectedJson, $message);
2690
        static::assertJson($actualJson, $message);
2691
2692
        static::assertThat(
2693
            $actualJson,
2694
            new LogicalNot(
2695
                new JsonMatches($expectedJson)
2696
            ),
2697
            $message
2698
        );
2699
    }
2700
2701
    /**
2702
     * Asserts that two JSON files are equal.
2703
     *
2704
     * @throws ExpectationFailedException
2705
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2706
     */
2707
    public static function assertJsonFileEqualsJsonFile(string $expectedFile, string $actualFile, string $message = ''): void
2708
    {
2709
        static::assertFileExists($expectedFile, $message);
2710
        static::assertFileExists($actualFile, $message);
2711
2712
        $actualJson   = \file_get_contents($actualFile);
2713
        $expectedJson = \file_get_contents($expectedFile);
2714
2715
        static::assertJson($expectedJson, $message);
2716
        static::assertJson($actualJson, $message);
2717
2718
        $constraintExpected = new JsonMatches(
2719
            $expectedJson
2720
        );
2721
2722
        $constraintActual = new JsonMatches($actualJson);
2723
2724
        static::assertThat($expectedJson, $constraintActual, $message);
2725
        static::assertThat($actualJson, $constraintExpected, $message);
2726
    }
2727
2728
    /**
2729
     * Asserts that two JSON files are not equal.
2730
     *
2731
     * @throws ExpectationFailedException
2732
     * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
2733
     */
2734
    public static function assertJsonFileNotEqualsJsonFile(string $expectedFile, string $actualFile, string $message = ''): void
2735
    {
2736
        static::assertFileExists($expectedFile, $message);
2737
        static::assertFileExists($actualFile, $message);
2738
2739
        $actualJson   = \file_get_contents($actualFile);
2740
        $expectedJson = \file_get_contents($expectedFile);
2741
2742
        static::assertJson($expectedJson, $message);
2743
        static::assertJson($actualJson, $message);
2744
2745
        $constraintExpected = new JsonMatches(
2746
            $expectedJson
2747
        );
2748
2749
        $constraintActual = new JsonMatches($actualJson);
2750
2751
        static::assertThat($expectedJson, new LogicalNot($constraintActual), $message);
2752
        static::assertThat($actualJson, new LogicalNot($constraintExpected), $message);
2753
    }
2754
2755
    /**
2756
     * @throws Exception
2757
     */
2758
    public static function logicalAnd(): LogicalAnd
2759
    {
2760
        $constraints = \func_get_args();
2761
2762
        $constraint = new LogicalAnd;
2763
        $constraint->setConstraints($constraints);
2764
2765
        return $constraint;
2766
    }
2767
2768
    public static function logicalOr(): LogicalOr
2769
    {
2770
        $constraints = \func_get_args();
2771
2772
        $constraint = new LogicalOr;
2773
        $constraint->setConstraints($constraints);
2774
2775
        return $constraint;
2776
    }
2777
2778
    public static function logicalNot(Constraint $constraint): LogicalNot
2779
    {
2780
        return new LogicalNot($constraint);
2781
    }
2782
2783
    public static function logicalXor(): LogicalXor
2784
    {
2785
        $constraints = \func_get_args();
2786
2787
        $constraint = new LogicalXor;
2788
        $constraint->setConstraints($constraints);
2789
2790
        return $constraint;
2791
    }
2792
2793
    public static function anything(): IsAnything
2794
    {
2795
        return new IsAnything;
2796
    }
2797
2798
    public static function isTrue(): IsTrue
2799
    {
2800
        return new IsTrue;
2801
    }
2802
2803
    public static function callback(callable $callback): Callback
2804
    {
2805
        return new Callback($callback);
2806
    }
2807
2808
    public static function isFalse(): IsFalse
2809
    {
2810
        return new IsFalse;
2811
    }
2812
2813
    public static function isJson(): IsJson
2814
    {
2815
        return new IsJson;
2816
    }
2817
2818
    public static function isNull(): IsNull
2819
    {
2820
        return new IsNull;
2821
    }
2822
2823
    public static function isFinite(): IsFinite
2824
    {
2825
        return new IsFinite;
2826
    }
2827
2828
    public static function isInfinite(): IsInfinite
2829
    {
2830
        return new IsInfinite;
2831
    }
2832
2833
    public static function isNan(): IsNan
2834
    {
2835
        return new IsNan;
2836
    }
2837
2838
    /**
2839
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
2840
     * @codeCoverageIgnore
2841
     */
2842
    public static function attribute(Constraint $constraint, string $attributeName): Attribute
2843
    {
2844
        self::createWarning('attribute() is deprecated and will be removed in PHPUnit 9.');
2845
2846
        return new Attribute($constraint, $attributeName);
2847
    }
2848
2849
    public static function contains($value, bool $checkForObjectIdentity = true, bool $checkForNonObjectIdentity = false): TraversableContains
2850
    {
2851
        return new TraversableContains($value, $checkForObjectIdentity, $checkForNonObjectIdentity);
2852
    }
2853
2854
    public static function containsOnly(string $type): TraversableContainsOnly
2855
    {
2856
        return new TraversableContainsOnly($type);
2857
    }
2858
2859
    public static function containsOnlyInstancesOf(string $className): TraversableContainsOnly
2860
    {
2861
        return new TraversableContainsOnly($className, false);
2862
    }
2863
2864
    /**
2865
     * @param int|string $key
2866
     */
2867
    public static function arrayHasKey($key): ArrayHasKey
2868
    {
2869
        return new ArrayHasKey($key);
2870
    }
2871
2872
    public static function equalTo($value, float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): IsEqual
2873
    {
2874
        return new IsEqual($value, $delta, $maxDepth, $canonicalize, $ignoreCase);
2875
    }
2876
2877
    /**
2878
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
2879
     * @codeCoverageIgnore
2880
     */
2881
    public static function attributeEqualTo(string $attributeName, $value, float $delta = 0.0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): Attribute
2882
    {
2883
        self::createWarning('attributeEqualTo() is deprecated and will be removed in PHPUnit 9.');
2884
2885
        return static::attribute(
2886
            static::equalTo(
2887
                $value,
2888
                $delta,
2889
                $maxDepth,
2890
                $canonicalize,
2891
                $ignoreCase
2892
            ),
2893
            $attributeName
2894
        );
2895
    }
2896
2897
    public static function isEmpty(): IsEmpty
2898
    {
2899
        return new IsEmpty;
2900
    }
2901
2902
    public static function isWritable(): IsWritable
2903
    {
2904
        return new IsWritable;
2905
    }
2906
2907
    public static function isReadable(): IsReadable
2908
    {
2909
        return new IsReadable;
2910
    }
2911
2912
    public static function directoryExists(): DirectoryExists
2913
    {
2914
        return new DirectoryExists;
2915
    }
2916
2917
    public static function fileExists(): FileExists
2918
    {
2919
        return new FileExists;
2920
    }
2921
2922
    public static function greaterThan($value): GreaterThan
2923
    {
2924
        return new GreaterThan($value);
2925
    }
2926
2927
    public static function greaterThanOrEqual($value): LogicalOr
2928
    {
2929
        return static::logicalOr(
2930
            new IsEqual($value),
2931
            new GreaterThan($value)
2932
        );
2933
    }
2934
2935
    public static function classHasAttribute(string $attributeName): ClassHasAttribute
2936
    {
2937
        return new ClassHasAttribute($attributeName);
2938
    }
2939
2940
    public static function classHasStaticAttribute(string $attributeName): ClassHasStaticAttribute
2941
    {
2942
        return new ClassHasStaticAttribute($attributeName);
2943
    }
2944
2945
    public static function objectHasAttribute($attributeName): ObjectHasAttribute
2946
    {
2947
        return new ObjectHasAttribute($attributeName);
2948
    }
2949
2950
    public static function identicalTo($value): IsIdentical
2951
    {
2952
        return new IsIdentical($value);
2953
    }
2954
2955
    public static function isInstanceOf(string $className): IsInstanceOf
2956
    {
2957
        return new IsInstanceOf($className);
2958
    }
2959
2960
    public static function isType(string $type): IsType
2961
    {
2962
        return new IsType($type);
2963
    }
2964
2965
    public static function lessThan($value): LessThan
2966
    {
2967
        return new LessThan($value);
2968
    }
2969
2970
    public static function lessThanOrEqual($value): LogicalOr
2971
    {
2972
        return static::logicalOr(
2973
            new IsEqual($value),
2974
            new LessThan($value)
2975
        );
2976
    }
2977
2978
    public static function matchesRegularExpression(string $pattern): RegularExpression
2979
    {
2980
        return new RegularExpression($pattern);
2981
    }
2982
2983
    public static function matches(string $string): StringMatchesFormatDescription
2984
    {
2985
        return new StringMatchesFormatDescription($string);
2986
    }
2987
2988
    public static function stringStartsWith($prefix): StringStartsWith
2989
    {
2990
        return new StringStartsWith($prefix);
2991
    }
2992
2993
    public static function stringContains(string $string, bool $case = true): StringContains
2994
    {
2995
        return new StringContains($string, $case);
2996
    }
2997
2998
    public static function stringEndsWith(string $suffix): StringEndsWith
2999
    {
3000
        return new StringEndsWith($suffix);
3001
    }
3002
3003
    public static function countOf(int $count): Count
3004
    {
3005
        return new Count($count);
3006
    }
3007
3008
    /**
3009
     * Fails a test with the given message.
3010
     *
3011
     * @throws AssertionFailedError
3012
     */
3013
    public static function fail(string $message = ''): void
3014
    {
3015
        self::$count++;
3016
3017
        throw new AssertionFailedError($message);
3018
    }
3019
3020
    /**
3021
     * Returns the value of an attribute of a class or an object.
3022
     * This also works for attributes that are declared protected or private.
3023
     *
3024
     * @param object|string $classOrObject
3025
     *
3026
     * @throws Exception
3027
     * @throws ReflectionException
3028
     *
3029
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
3030
     * @codeCoverageIgnore
3031
     */
3032
    public static function readAttribute($classOrObject, string $attributeName)
3033
    {
3034
        self::createWarning('readAttribute() is deprecated and will be removed in PHPUnit 9.');
3035
3036
        if (!self::isValidClassAttributeName($attributeName)) {
3037
            throw InvalidArgumentHelper::factory(2, 'valid attribute name');
3038
        }
3039
3040
        if (\is_string($classOrObject)) {
3041
            if (!\class_exists($classOrObject)) {
3042
                throw InvalidArgumentHelper::factory(
3043
                    1,
3044
                    'class name'
3045
                );
3046
            }
3047
3048
            return static::getStaticAttribute(
3049
                $classOrObject,
3050
                $attributeName
3051
            );
3052
        }
3053
3054
        if (\is_object($classOrObject)) {
3055
            return static::getObjectAttribute(
3056
                $classOrObject,
3057
                $attributeName
3058
            );
3059
        }
3060
3061
        throw InvalidArgumentHelper::factory(
3062
            1,
3063
            'class name or object'
3064
        );
3065
    }
3066
3067
    /**
3068
     * Returns the value of a static attribute.
3069
     * This also works for attributes that are declared protected or private.
3070
     *
3071
     * @throws Exception
3072
     * @throws ReflectionException
3073
     *
3074
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
3075
     * @codeCoverageIgnore
3076
     */
3077
    public static function getStaticAttribute(string $className, string $attributeName)
3078
    {
3079
        self::createWarning('getStaticAttribute() is deprecated and will be removed in PHPUnit 9.');
3080
3081
        if (!\class_exists($className)) {
3082
            throw InvalidArgumentHelper::factory(1, 'class name');
3083
        }
3084
3085
        if (!self::isValidClassAttributeName($attributeName)) {
3086
            throw InvalidArgumentHelper::factory(2, 'valid attribute name');
3087
        }
3088
3089
        $class = new ReflectionClass($className);
3090
3091
        while ($class) {
3092
            $attributes = $class->getStaticProperties();
3093
3094
            if (\array_key_exists($attributeName, $attributes)) {
3095
                return $attributes[$attributeName];
3096
            }
3097
3098
            $class = $class->getParentClass();
3099
        }
3100
3101
        throw new Exception(
3102
            \sprintf(
3103
                'Attribute "%s" not found in class.',
3104
                $attributeName
3105
            )
3106
        );
3107
    }
3108
3109
    /**
3110
     * Returns the value of an object's attribute.
3111
     * This also works for attributes that are declared protected or private.
3112
     *
3113
     * @param object $object
3114
     *
3115
     * @throws Exception
3116
     *
3117
     * @deprecated https://github.com/sebastianbergmann/phpunit/issues/3338
3118
     * @codeCoverageIgnore
3119
     */
3120
    public static function getObjectAttribute($object, string $attributeName)
3121
    {
3122
        self::createWarning('getObjectAttribute() is deprecated and will be removed in PHPUnit 9.');
3123
3124
        if (!\is_object($object)) {
3125
            throw InvalidArgumentHelper::factory(1, 'object');
3126
        }
3127
3128
        if (!self::isValidClassAttributeName($attributeName)) {
3129
            throw InvalidArgumentHelper::factory(2, 'valid attribute name');
3130
        }
3131
3132
        try {
3133
            $reflector = new ReflectionObject($object);
3134
3135
            do {
3136
                try {
3137
                    $attribute = $reflector->getProperty($attributeName);
3138
3139
                    if (!$attribute || $attribute->isPublic()) {
3140
                        return $object->$attributeName;
3141
                    }
3142
3143
                    $attribute->setAccessible(true);
3144
                    $value = $attribute->getValue($object);
3145
                    $attribute->setAccessible(false);
3146
3147
                    return $value;
3148
                } catch (ReflectionException $e) {
3149
                }
3150
            } while ($reflector = $reflector->getParentClass());
3151
        } catch (ReflectionException $e) {
3152
        }
3153
3154
        throw new Exception(
3155
            \sprintf(
3156
                'Attribute "%s" not found in object.',
3157
                $attributeName
3158
            )
3159
        );
3160
    }
3161
3162
    /**
3163
     * Mark the test as incomplete.
3164
     *
3165
     * @throws IncompleteTestError
3166
     */
3167
    public static function markTestIncomplete(string $message = ''): void
3168
    {
3169
        throw new IncompleteTestError($message);
3170
    }
3171
3172
    /**
3173
     * Mark the test as skipped.
3174
     *
3175
     * @throws SkippedTestError
3176
     * @throws SyntheticSkippedError
3177
     */
3178
    public static function markTestSkipped(string $message = ''): void
3179
    {
3180
        if ($hint = self::detectLocationHint($message)) {
3181
            $trace = \debug_backtrace(\DEBUG_BACKTRACE_IGNORE_ARGS);
3182
            \array_unshift($trace, $hint);
3183
3184
            throw new SyntheticSkippedError($hint['message'], 0, $hint['file'], (int) $hint['line'], $trace);
3185
        }
3186
3187
        throw new SkippedTestError($message);
3188
    }
3189
3190
    /**
3191
     * Return the current assertion count.
3192
     */
3193
    public static function getCount(): int
3194
    {
3195
        return self::$count;
3196
    }
3197
3198
    /**
3199
     * Reset the assertion counter.
3200
     */
3201
    public static function resetCount(): void
3202
    {
3203
        self::$count = 0;
3204
    }
3205
3206
    private static function detectLocationHint(string $message): ?array
3207
    {
3208
        $hint  = null;
3209
        $lines = \preg_split('/\r\n|\r|\n/', $message);
3210
3211
        while (\strpos($lines[0], '__OFFSET') !== false) {
3212
            $offset = \explode('=', \array_shift($lines));
3213
3214
            if ($offset[0] === '__OFFSET_FILE') {
3215
                $hint['file'] = $offset[1];
3216
            }
3217
3218
            if ($offset[0] === '__OFFSET_LINE') {
3219
                $hint['line'] = $offset[1];
3220
            }
3221
        }
3222
3223
        if ($hint) {
3224
            $hint['message'] = \implode(\PHP_EOL, $lines);
3225
        }
3226
3227
        return $hint;
3228
    }
3229
3230
    private static function isValidObjectAttributeName(string $attributeName): bool
3231
    {
3232
        return (bool) \preg_match('/[^\x00-\x1f\x7f-\x9f]+/', $attributeName);
3233
    }
3234
3235
    private static function isValidClassAttributeName(string $attributeName): bool
3236
    {
3237
        return (bool) \preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName);
3238
    }
3239
3240
    /**
3241
     * @codeCoverageIgnore
3242
     */
3243
    private static function createWarning(string $warning): void
3244
    {
3245
        foreach (\debug_backtrace() as $step) {
3246
            if (isset($step['object']) && $step['object'] instanceof TestCase) {
3247
                \assert($step['object'] instanceof TestCase);
3248
3249
                $step['object']->addWarning($warning);
3250
3251
                break;
3252
            }
3253
        }
3254
    }
3255
}
3256