Completed
Push — master ( 95acd7...e70d94 )
by Naveen
13:02 queued 11:07
created

PHPUnit_Framework_Assert   F

Complexity

Total Complexity 287

Size/Duplication

Total Lines 3150
Duplicated Lines 23.52 %

Coupling/Cohesion

Components 1
Dependencies 41
Metric Value
wmc 287
lcom 1
cbo 41
dl 741
loc 3150
rs 0.5217

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like PHPUnit_Framework_Assert often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use PHPUnit_Framework_Assert, and based on these observations, apply Extract Interface, too.

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