1: | <?php
|
2: |
|
3: | |
4: | |
5: | |
6: | |
7: | |
8: | |
9: | |
10: |
|
11: |
|
12: | namespace Webmozart\Assert;
|
13: |
|
14: | use ArrayAccess;
|
15: | use BadMethodCallException;
|
16: | use Closure;
|
17: | use Countable;
|
18: | use DateTime;
|
19: | use DateTimeImmutable;
|
20: | use Exception;
|
21: | use InvalidArgumentException;
|
22: | use ResourceBundle;
|
23: | use SimpleXMLElement;
|
24: | use Throwable;
|
25: | use Traversable;
|
26: |
|
27: | |
28: | |
29: | |
30: | |
31: | |
32: | |
33: | |
34: | |
35: |
|
36: | class Assert
|
37: | {
|
38: | |
39: | |
40: | |
41: | |
42: | |
43: | |
44: | |
45: | |
46: |
|
47: | public static function string($value, $message = '')
|
48: | {
|
49: | if (!\is_string($value)) {
|
50: | static::reportInvalidArgument(\sprintf(
|
51: | $message ?: 'Expected a string. Got: %s',
|
52: | static::typeToString($value)
|
53: | ));
|
54: | }
|
55: | }
|
56: |
|
57: | |
58: | |
59: | |
60: | |
61: | |
62: | |
63: | |
64: | |
65: |
|
66: | public static function stringNotEmpty($value, $message = '')
|
67: | {
|
68: | static::string($value, $message);
|
69: | static::notEq($value, '', $message);
|
70: | }
|
71: |
|
72: | |
73: | |
74: | |
75: | |
76: | |
77: | |
78: | |
79: | |
80: |
|
81: | public static function integer($value, $message = '')
|
82: | {
|
83: | if (!\is_int($value)) {
|
84: | static::reportInvalidArgument(\sprintf(
|
85: | $message ?: 'Expected an integer. Got: %s',
|
86: | static::typeToString($value)
|
87: | ));
|
88: | }
|
89: | }
|
90: |
|
91: | |
92: | |
93: | |
94: | |
95: | |
96: | |
97: | |
98: | |
99: |
|
100: | public static function integerish($value, $message = '')
|
101: | {
|
102: | if (!\is_numeric($value) || $value != (int) $value) {
|
103: | static::reportInvalidArgument(\sprintf(
|
104: | $message ?: 'Expected an integerish value. Got: %s',
|
105: | static::typeToString($value)
|
106: | ));
|
107: | }
|
108: | }
|
109: |
|
110: | |
111: | |
112: | |
113: | |
114: | |
115: | |
116: | |
117: | |
118: |
|
119: | public static function float($value, $message = '')
|
120: | {
|
121: | if (!\is_float($value)) {
|
122: | static::reportInvalidArgument(\sprintf(
|
123: | $message ?: 'Expected a float. Got: %s',
|
124: | static::typeToString($value)
|
125: | ));
|
126: | }
|
127: | }
|
128: |
|
129: | |
130: | |
131: | |
132: | |
133: | |
134: | |
135: | |
136: | |
137: |
|
138: | public static function numeric($value, $message = '')
|
139: | {
|
140: | if (!\is_numeric($value)) {
|
141: | static::reportInvalidArgument(\sprintf(
|
142: | $message ?: 'Expected a numeric. Got: %s',
|
143: | static::typeToString($value)
|
144: | ));
|
145: | }
|
146: | }
|
147: |
|
148: | |
149: | |
150: | |
151: | |
152: | |
153: | |
154: | |
155: | |
156: |
|
157: | public static function natural($value, $message = '')
|
158: | {
|
159: | if (!\is_int($value) || $value < 0) {
|
160: | static::reportInvalidArgument(\sprintf(
|
161: | $message ?: 'Expected a non-negative integer. Got: %s',
|
162: | static::valueToString($value)
|
163: | ));
|
164: | }
|
165: | }
|
166: |
|
167: | |
168: | |
169: | |
170: | |
171: | |
172: | |
173: | |
174: | |
175: |
|
176: | public static function boolean($value, $message = '')
|
177: | {
|
178: | if (!\is_bool($value)) {
|
179: | static::reportInvalidArgument(\sprintf(
|
180: | $message ?: 'Expected a boolean. Got: %s',
|
181: | static::typeToString($value)
|
182: | ));
|
183: | }
|
184: | }
|
185: |
|
186: | |
187: | |
188: | |
189: | |
190: | |
191: | |
192: | |
193: | |
194: |
|
195: | public static function scalar($value, $message = '')
|
196: | {
|
197: | if (!\is_scalar($value)) {
|
198: | static::reportInvalidArgument(\sprintf(
|
199: | $message ?: 'Expected a scalar. Got: %s',
|
200: | static::typeToString($value)
|
201: | ));
|
202: | }
|
203: | }
|
204: |
|
205: | |
206: | |
207: | |
208: | |
209: | |
210: | |
211: | |
212: | |
213: |
|
214: | public static function object($value, $message = '')
|
215: | {
|
216: | if (!\is_object($value)) {
|
217: | static::reportInvalidArgument(\sprintf(
|
218: | $message ?: 'Expected an object. Got: %s',
|
219: | static::typeToString($value)
|
220: | ));
|
221: | }
|
222: | }
|
223: |
|
224: | |
225: | |
226: | |
227: | |
228: | |
229: | |
230: | |
231: | |
232: | |
233: |
|
234: | public static function resource($value, $type = null, $message = '')
|
235: | {
|
236: | if (!\is_resource($value)) {
|
237: | static::reportInvalidArgument(\sprintf(
|
238: | $message ?: 'Expected a resource. Got: %s',
|
239: | static::typeToString($value)
|
240: | ));
|
241: | }
|
242: |
|
243: | if ($type && $type !== \get_resource_type($value)) {
|
244: | static::reportInvalidArgument(\sprintf(
|
245: | $message ?: 'Expected a resource of type %2$s. Got: %s',
|
246: | static::typeToString($value),
|
247: | $type
|
248: | ));
|
249: | }
|
250: | }
|
251: |
|
252: | |
253: | |
254: | |
255: | |
256: | |
257: | |
258: | |
259: | |
260: |
|
261: | public static function isCallable($value, $message = '')
|
262: | {
|
263: | if (!\is_callable($value)) {
|
264: | static::reportInvalidArgument(\sprintf(
|
265: | $message ?: 'Expected a callable. Got: %s',
|
266: | static::typeToString($value)
|
267: | ));
|
268: | }
|
269: | }
|
270: |
|
271: | |
272: | |
273: | |
274: | |
275: | |
276: | |
277: | |
278: | |
279: |
|
280: | public static function isArray($value, $message = '')
|
281: | {
|
282: | if (!\is_array($value)) {
|
283: | static::reportInvalidArgument(\sprintf(
|
284: | $message ?: 'Expected an array. Got: %s',
|
285: | static::typeToString($value)
|
286: | ));
|
287: | }
|
288: | }
|
289: |
|
290: | |
291: | |
292: | |
293: | |
294: | |
295: | |
296: | |
297: | |
298: | |
299: | |
300: |
|
301: | public static function isTraversable($value, $message = '')
|
302: | {
|
303: | @\trigger_error(
|
304: | \sprintf(
|
305: | 'The "%s" assertion is deprecated. You should stop using it, as it will soon be removed in 2.0 version. Use "isIterable" or "isInstanceOf" instead.',
|
306: | __METHOD__
|
307: | ),
|
308: | \E_USER_DEPRECATED
|
309: | );
|
310: |
|
311: | if (!\is_array($value) && !($value instanceof Traversable)) {
|
312: | static::reportInvalidArgument(\sprintf(
|
313: | $message ?: 'Expected a traversable. Got: %s',
|
314: | static::typeToString($value)
|
315: | ));
|
316: | }
|
317: | }
|
318: |
|
319: | |
320: | |
321: | |
322: | |
323: | |
324: | |
325: | |
326: | |
327: |
|
328: | public static function isArrayAccessible($value, $message = '')
|
329: | {
|
330: | if (!\is_array($value) && !($value instanceof ArrayAccess)) {
|
331: | static::reportInvalidArgument(\sprintf(
|
332: | $message ?: 'Expected an array accessible. Got: %s',
|
333: | static::typeToString($value)
|
334: | ));
|
335: | }
|
336: | }
|
337: |
|
338: | |
339: | |
340: | |
341: | |
342: | |
343: | |
344: | |
345: | |
346: |
|
347: | public static function isCountable($value, $message = '')
|
348: | {
|
349: | if (
|
350: | !\is_array($value)
|
351: | && !($value instanceof Countable)
|
352: | && !($value instanceof ResourceBundle)
|
353: | && !($value instanceof SimpleXMLElement)
|
354: | ) {
|
355: | static::reportInvalidArgument(\sprintf(
|
356: | $message ?: 'Expected a countable. Got: %s',
|
357: | static::typeToString($value)
|
358: | ));
|
359: | }
|
360: | }
|
361: |
|
362: | |
363: | |
364: | |
365: | |
366: | |
367: | |
368: | |
369: | |
370: |
|
371: | public static function isIterable($value, $message = '')
|
372: | {
|
373: | if (!\is_array($value) && !($value instanceof Traversable)) {
|
374: | static::reportInvalidArgument(\sprintf(
|
375: | $message ?: 'Expected an iterable. Got: %s',
|
376: | static::typeToString($value)
|
377: | ));
|
378: | }
|
379: | }
|
380: |
|
381: | |
382: | |
383: | |
384: | |
385: | |
386: | |
387: | |
388: | |
389: | |
390: | |
391: | |
392: |
|
393: | public static function isInstanceOf($value, $class, $message = '')
|
394: | {
|
395: | if (!($value instanceof $class)) {
|
396: | static::reportInvalidArgument(\sprintf(
|
397: | $message ?: 'Expected an instance of %2$s. Got: %s',
|
398: | static::typeToString($value),
|
399: | $class
|
400: | ));
|
401: | }
|
402: | }
|
403: |
|
404: | |
405: | |
406: | |
407: | |
408: | |
409: | |
410: | |
411: | |
412: | |
413: | |
414: | |
415: |
|
416: | public static function notInstanceOf($value, $class, $message = '')
|
417: | {
|
418: | if ($value instanceof $class) {
|
419: | static::reportInvalidArgument(\sprintf(
|
420: | $message ?: 'Expected an instance other than %2$s. Got: %s',
|
421: | static::typeToString($value),
|
422: | $class
|
423: | ));
|
424: | }
|
425: | }
|
426: |
|
427: | |
428: | |
429: | |
430: | |
431: | |
432: | |
433: | |
434: | |
435: | |
436: |
|
437: | public static function isInstanceOfAny($value, array $classes, $message = '')
|
438: | {
|
439: | foreach ($classes as $class) {
|
440: | if ($value instanceof $class) {
|
441: | return;
|
442: | }
|
443: | }
|
444: |
|
445: | static::reportInvalidArgument(\sprintf(
|
446: | $message ?: 'Expected an instance of any of %2$s. Got: %s',
|
447: | static::typeToString($value),
|
448: | \implode(', ', \array_map(array('static', 'valueToString'), $classes))
|
449: | ));
|
450: | }
|
451: |
|
452: | |
453: | |
454: | |
455: | |
456: | |
457: | |
458: | |
459: | |
460: | |
461: | |
462: | |
463: |
|
464: | public static function isAOf($value, $class, $message = '')
|
465: | {
|
466: | static::string($class, 'Expected class as a string. Got: %s');
|
467: |
|
468: | if (!\is_a($value, $class, \is_string($value))) {
|
469: | static::reportInvalidArgument(sprintf(
|
470: | $message ?: 'Expected an instance of this class or to this class among his parents %2$s. Got: %s',
|
471: | static::typeToString($value),
|
472: | $class
|
473: | ));
|
474: | }
|
475: | }
|
476: |
|
477: | |
478: | |
479: | |
480: | |
481: | |
482: | |
483: | |
484: | |
485: | |
486: | |
487: | |
488: | |
489: |
|
490: | public static function isNotA($value, $class, $message = '')
|
491: | {
|
492: | static::string($class, 'Expected class as a string. Got: %s');
|
493: |
|
494: | if (\is_a($value, $class, \is_string($value))) {
|
495: | static::reportInvalidArgument(sprintf(
|
496: | $message ?: 'Expected an instance of this class or to this class among his parents other than %2$s. Got: %s',
|
497: | static::typeToString($value),
|
498: | $class
|
499: | ));
|
500: | }
|
501: | }
|
502: |
|
503: | |
504: | |
505: | |
506: | |
507: | |
508: | |
509: | |
510: | |
511: | |
512: |
|
513: | public static function isAnyOf($value, array $classes, $message = '')
|
514: | {
|
515: | foreach ($classes as $class) {
|
516: | static::string($class, 'Expected class as a string. Got: %s');
|
517: |
|
518: | if (\is_a($value, $class, \is_string($value))) {
|
519: | return;
|
520: | }
|
521: | }
|
522: |
|
523: | static::reportInvalidArgument(sprintf(
|
524: | $message ?: 'Expected an any of instance of this class or to this class among his parents other than %2$s. Got: %s',
|
525: | static::typeToString($value),
|
526: | \implode(', ', \array_map(array('static', 'valueToString'), $classes))
|
527: | ));
|
528: | }
|
529: |
|
530: | |
531: | |
532: | |
533: | |
534: | |
535: | |
536: | |
537: | |
538: |
|
539: | public static function isEmpty($value, $message = '')
|
540: | {
|
541: | if (!empty($value)) {
|
542: | static::reportInvalidArgument(\sprintf(
|
543: | $message ?: 'Expected an empty value. Got: %s',
|
544: | static::valueToString($value)
|
545: | ));
|
546: | }
|
547: | }
|
548: |
|
549: | |
550: | |
551: | |
552: | |
553: | |
554: | |
555: | |
556: | |
557: |
|
558: | public static function notEmpty($value, $message = '')
|
559: | {
|
560: | if (empty($value)) {
|
561: | static::reportInvalidArgument(\sprintf(
|
562: | $message ?: 'Expected a non-empty value. Got: %s',
|
563: | static::valueToString($value)
|
564: | ));
|
565: | }
|
566: | }
|
567: |
|
568: | |
569: | |
570: | |
571: | |
572: | |
573: | |
574: | |
575: | |
576: |
|
577: | public static function null($value, $message = '')
|
578: | {
|
579: | if (null !== $value) {
|
580: | static::reportInvalidArgument(\sprintf(
|
581: | $message ?: 'Expected null. Got: %s',
|
582: | static::valueToString($value)
|
583: | ));
|
584: | }
|
585: | }
|
586: |
|
587: | |
588: | |
589: | |
590: | |
591: | |
592: | |
593: | |
594: | |
595: |
|
596: | public static function notNull($value, $message = '')
|
597: | {
|
598: | if (null === $value) {
|
599: | static::reportInvalidArgument(
|
600: | $message ?: 'Expected a value other than null.'
|
601: | );
|
602: | }
|
603: | }
|
604: |
|
605: | |
606: | |
607: | |
608: | |
609: | |
610: | |
611: | |
612: | |
613: |
|
614: | public static function true($value, $message = '')
|
615: | {
|
616: | if (true !== $value) {
|
617: | static::reportInvalidArgument(\sprintf(
|
618: | $message ?: 'Expected a value to be true. Got: %s',
|
619: | static::valueToString($value)
|
620: | ));
|
621: | }
|
622: | }
|
623: |
|
624: | |
625: | |
626: | |
627: | |
628: | |
629: | |
630: | |
631: | |
632: |
|
633: | public static function false($value, $message = '')
|
634: | {
|
635: | if (false !== $value) {
|
636: | static::reportInvalidArgument(\sprintf(
|
637: | $message ?: 'Expected a value to be false. Got: %s',
|
638: | static::valueToString($value)
|
639: | ));
|
640: | }
|
641: | }
|
642: |
|
643: | |
644: | |
645: | |
646: | |
647: | |
648: | |
649: | |
650: | |
651: |
|
652: | public static function notFalse($value, $message = '')
|
653: | {
|
654: | if (false === $value) {
|
655: | static::reportInvalidArgument(
|
656: | $message ?: 'Expected a value other than false.'
|
657: | );
|
658: | }
|
659: | }
|
660: |
|
661: | |
662: | |
663: | |
664: | |
665: | |
666: |
|
667: | public static function ip($value, $message = '')
|
668: | {
|
669: | if (false === \filter_var($value, \FILTER_VALIDATE_IP)) {
|
670: | static::reportInvalidArgument(\sprintf(
|
671: | $message ?: 'Expected a value to be an IP. Got: %s',
|
672: | static::valueToString($value)
|
673: | ));
|
674: | }
|
675: | }
|
676: |
|
677: | |
678: | |
679: | |
680: | |
681: | |
682: |
|
683: | public static function ipv4($value, $message = '')
|
684: | {
|
685: | if (false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV4)) {
|
686: | static::reportInvalidArgument(\sprintf(
|
687: | $message ?: 'Expected a value to be an IPv4. Got: %s',
|
688: | static::valueToString($value)
|
689: | ));
|
690: | }
|
691: | }
|
692: |
|
693: | |
694: | |
695: | |
696: | |
697: | |
698: |
|
699: | public static function ipv6($value, $message = '')
|
700: | {
|
701: | if (false === \filter_var($value, \FILTER_VALIDATE_IP, \FILTER_FLAG_IPV6)) {
|
702: | static::reportInvalidArgument(\sprintf(
|
703: | $message ?: 'Expected a value to be an IPv6. Got: %s',
|
704: | static::valueToString($value)
|
705: | ));
|
706: | }
|
707: | }
|
708: |
|
709: | |
710: | |
711: | |
712: | |
713: | |
714: |
|
715: | public static function email($value, $message = '')
|
716: | {
|
717: | if (false === \filter_var($value, FILTER_VALIDATE_EMAIL)) {
|
718: | static::reportInvalidArgument(\sprintf(
|
719: | $message ?: 'Expected a value to be a valid e-mail address. Got: %s',
|
720: | static::valueToString($value)
|
721: | ));
|
722: | }
|
723: | }
|
724: |
|
725: | |
726: | |
727: | |
728: | |
729: | |
730: | |
731: | |
732: |
|
733: | public static function uniqueValues(array $values, $message = '')
|
734: | {
|
735: | $allValues = \count($values);
|
736: | $uniqueValues = \count(\array_unique($values));
|
737: |
|
738: | if ($allValues !== $uniqueValues) {
|
739: | $difference = $allValues - $uniqueValues;
|
740: |
|
741: | static::reportInvalidArgument(\sprintf(
|
742: | $message ?: 'Expected an array of unique values, but %s of them %s duplicated',
|
743: | $difference,
|
744: | (1 === $difference ? 'is' : 'are')
|
745: | ));
|
746: | }
|
747: | }
|
748: |
|
749: | |
750: | |
751: | |
752: | |
753: | |
754: | |
755: |
|
756: | public static function eq($value, $expect, $message = '')
|
757: | {
|
758: | if ($expect != $value) {
|
759: | static::reportInvalidArgument(\sprintf(
|
760: | $message ?: 'Expected a value equal to %2$s. Got: %s',
|
761: | static::valueToString($value),
|
762: | static::valueToString($expect)
|
763: | ));
|
764: | }
|
765: | }
|
766: |
|
767: | |
768: | |
769: | |
770: | |
771: | |
772: | |
773: |
|
774: | public static function notEq($value, $expect, $message = '')
|
775: | {
|
776: | if ($expect == $value) {
|
777: | static::reportInvalidArgument(\sprintf(
|
778: | $message ?: 'Expected a different value than %s.',
|
779: | static::valueToString($expect)
|
780: | ));
|
781: | }
|
782: | }
|
783: |
|
784: | |
785: | |
786: | |
787: | |
788: | |
789: | |
790: | |
791: | |
792: |
|
793: | public static function same($value, $expect, $message = '')
|
794: | {
|
795: | if ($expect !== $value) {
|
796: | static::reportInvalidArgument(\sprintf(
|
797: | $message ?: 'Expected a value identical to %2$s. Got: %s',
|
798: | static::valueToString($value),
|
799: | static::valueToString($expect)
|
800: | ));
|
801: | }
|
802: | }
|
803: |
|
804: | |
805: | |
806: | |
807: | |
808: | |
809: | |
810: | |
811: | |
812: |
|
813: | public static function notSame($value, $expect, $message = '')
|
814: | {
|
815: | if ($expect === $value) {
|
816: | static::reportInvalidArgument(\sprintf(
|
817: | $message ?: 'Expected a value not identical to %s.',
|
818: | static::valueToString($expect)
|
819: | ));
|
820: | }
|
821: | }
|
822: |
|
823: | |
824: | |
825: | |
826: | |
827: | |
828: | |
829: | |
830: | |
831: |
|
832: | public static function greaterThan($value, $limit, $message = '')
|
833: | {
|
834: | if ($value <= $limit) {
|
835: | static::reportInvalidArgument(\sprintf(
|
836: | $message ?: 'Expected a value greater than %2$s. Got: %s',
|
837: | static::valueToString($value),
|
838: | static::valueToString($limit)
|
839: | ));
|
840: | }
|
841: | }
|
842: |
|
843: | |
844: | |
845: | |
846: | |
847: | |
848: | |
849: | |
850: | |
851: |
|
852: | public static function greaterThanEq($value, $limit, $message = '')
|
853: | {
|
854: | if ($value < $limit) {
|
855: | static::reportInvalidArgument(\sprintf(
|
856: | $message ?: 'Expected a value greater than or equal to %2$s. Got: %s',
|
857: | static::valueToString($value),
|
858: | static::valueToString($limit)
|
859: | ));
|
860: | }
|
861: | }
|
862: |
|
863: | |
864: | |
865: | |
866: | |
867: | |
868: | |
869: | |
870: | |
871: |
|
872: | public static function lessThan($value, $limit, $message = '')
|
873: | {
|
874: | if ($value >= $limit) {
|
875: | static::reportInvalidArgument(\sprintf(
|
876: | $message ?: 'Expected a value less than %2$s. Got: %s',
|
877: | static::valueToString($value),
|
878: | static::valueToString($limit)
|
879: | ));
|
880: | }
|
881: | }
|
882: |
|
883: | |
884: | |
885: | |
886: | |
887: | |
888: | |
889: | |
890: | |
891: |
|
892: | public static function lessThanEq($value, $limit, $message = '')
|
893: | {
|
894: | if ($value > $limit) {
|
895: | static::reportInvalidArgument(\sprintf(
|
896: | $message ?: 'Expected a value less than or equal to %2$s. Got: %s',
|
897: | static::valueToString($value),
|
898: | static::valueToString($limit)
|
899: | ));
|
900: | }
|
901: | }
|
902: |
|
903: | |
904: | |
905: | |
906: | |
907: | |
908: | |
909: | |
910: | |
911: | |
912: | |
913: | |
914: |
|
915: | public static function range($value, $min, $max, $message = '')
|
916: | {
|
917: | if ($value < $min || $value > $max) {
|
918: | static::reportInvalidArgument(\sprintf(
|
919: | $message ?: 'Expected a value between %2$s and %3$s. Got: %s',
|
920: | static::valueToString($value),
|
921: | static::valueToString($min),
|
922: | static::valueToString($max)
|
923: | ));
|
924: | }
|
925: | }
|
926: |
|
927: | |
928: | |
929: | |
930: | |
931: | |
932: | |
933: | |
934: | |
935: | |
936: | |
937: |
|
938: | public static function oneOf($value, array $values, $message = '')
|
939: | {
|
940: | static::inArray($value, $values, $message);
|
941: | }
|
942: |
|
943: | |
944: | |
945: | |
946: | |
947: | |
948: | |
949: | |
950: | |
951: | |
952: | |
953: |
|
954: | public static function inArray($value, array $values, $message = '')
|
955: | {
|
956: | if (!\in_array($value, $values, true)) {
|
957: | static::reportInvalidArgument(\sprintf(
|
958: | $message ?: 'Expected one of: %2$s. Got: %s',
|
959: | static::valueToString($value),
|
960: | \implode(', ', \array_map(array('static', 'valueToString'), $values))
|
961: | ));
|
962: | }
|
963: | }
|
964: |
|
965: | |
966: | |
967: | |
968: | |
969: | |
970: | |
971: | |
972: | |
973: |
|
974: | public static function contains($value, $subString, $message = '')
|
975: | {
|
976: | if (false === \strpos($value, $subString)) {
|
977: | static::reportInvalidArgument(\sprintf(
|
978: | $message ?: 'Expected a value to contain %2$s. Got: %s',
|
979: | static::valueToString($value),
|
980: | static::valueToString($subString)
|
981: | ));
|
982: | }
|
983: | }
|
984: |
|
985: | |
986: | |
987: | |
988: | |
989: | |
990: | |
991: | |
992: | |
993: |
|
994: | public static function notContains($value, $subString, $message = '')
|
995: | {
|
996: | if (false !== \strpos($value, $subString)) {
|
997: | static::reportInvalidArgument(\sprintf(
|
998: | $message ?: '%2$s was not expected to be contained in a value. Got: %s',
|
999: | static::valueToString($value),
|
1000: | static::valueToString($subString)
|
1001: | ));
|
1002: | }
|
1003: | }
|
1004: |
|
1005: | |
1006: | |
1007: | |
1008: | |
1009: | |
1010: | |
1011: | |
1012: |
|
1013: | public static function notWhitespaceOnly($value, $message = '')
|
1014: | {
|
1015: | if (\preg_match('/^\s*$/', $value)) {
|
1016: | static::reportInvalidArgument(\sprintf(
|
1017: | $message ?: 'Expected a non-whitespace string. Got: %s',
|
1018: | static::valueToString($value)
|
1019: | ));
|
1020: | }
|
1021: | }
|
1022: |
|
1023: | |
1024: | |
1025: | |
1026: | |
1027: | |
1028: | |
1029: | |
1030: | |
1031: |
|
1032: | public static function startsWith($value, $prefix, $message = '')
|
1033: | {
|
1034: | if (0 !== \strpos($value, $prefix)) {
|
1035: | static::reportInvalidArgument(\sprintf(
|
1036: | $message ?: 'Expected a value to start with %2$s. Got: %s',
|
1037: | static::valueToString($value),
|
1038: | static::valueToString($prefix)
|
1039: | ));
|
1040: | }
|
1041: | }
|
1042: |
|
1043: | |
1044: | |
1045: | |
1046: | |
1047: | |
1048: | |
1049: | |
1050: | |
1051: |
|
1052: | public static function notStartsWith($value, $prefix, $message = '')
|
1053: | {
|
1054: | if (0 === \strpos($value, $prefix)) {
|
1055: | static::reportInvalidArgument(\sprintf(
|
1056: | $message ?: 'Expected a value not to start with %2$s. Got: %s',
|
1057: | static::valueToString($value),
|
1058: | static::valueToString($prefix)
|
1059: | ));
|
1060: | }
|
1061: | }
|
1062: |
|
1063: | |
1064: | |
1065: | |
1066: | |
1067: | |
1068: | |
1069: | |
1070: |
|
1071: | public static function startsWithLetter($value, $message = '')
|
1072: | {
|
1073: | static::string($value);
|
1074: |
|
1075: | $valid = isset($value[0]);
|
1076: |
|
1077: | if ($valid) {
|
1078: | $locale = \setlocale(LC_CTYPE, 0);
|
1079: | \setlocale(LC_CTYPE, 'C');
|
1080: | $valid = \ctype_alpha($value[0]);
|
1081: | \setlocale(LC_CTYPE, $locale);
|
1082: | }
|
1083: |
|
1084: | if (!$valid) {
|
1085: | static::reportInvalidArgument(\sprintf(
|
1086: | $message ?: 'Expected a value to start with a letter. Got: %s',
|
1087: | static::valueToString($value)
|
1088: | ));
|
1089: | }
|
1090: | }
|
1091: |
|
1092: | |
1093: | |
1094: | |
1095: | |
1096: | |
1097: | |
1098: | |
1099: | |
1100: |
|
1101: | public static function endsWith($value, $suffix, $message = '')
|
1102: | {
|
1103: | if ($suffix !== \substr($value, -\strlen($suffix))) {
|
1104: | static::reportInvalidArgument(\sprintf(
|
1105: | $message ?: 'Expected a value to end with %2$s. Got: %s',
|
1106: | static::valueToString($value),
|
1107: | static::valueToString($suffix)
|
1108: | ));
|
1109: | }
|
1110: | }
|
1111: |
|
1112: | |
1113: | |
1114: | |
1115: | |
1116: | |
1117: | |
1118: | |
1119: | |
1120: |
|
1121: | public static function notEndsWith($value, $suffix, $message = '')
|
1122: | {
|
1123: | if ($suffix === \substr($value, -\strlen($suffix))) {
|
1124: | static::reportInvalidArgument(\sprintf(
|
1125: | $message ?: 'Expected a value not to end with %2$s. Got: %s',
|
1126: | static::valueToString($value),
|
1127: | static::valueToString($suffix)
|
1128: | ));
|
1129: | }
|
1130: | }
|
1131: |
|
1132: | |
1133: | |
1134: | |
1135: | |
1136: | |
1137: | |
1138: | |
1139: | |
1140: |
|
1141: | public static function regex($value, $pattern, $message = '')
|
1142: | {
|
1143: | if (!\preg_match($pattern, $value)) {
|
1144: | static::reportInvalidArgument(\sprintf(
|
1145: | $message ?: 'The value %s does not match the expected pattern.',
|
1146: | static::valueToString($value)
|
1147: | ));
|
1148: | }
|
1149: | }
|
1150: |
|
1151: | |
1152: | |
1153: | |
1154: | |
1155: | |
1156: | |
1157: | |
1158: | |
1159: |
|
1160: | public static function notRegex($value, $pattern, $message = '')
|
1161: | {
|
1162: | if (\preg_match($pattern, $value, $matches, PREG_OFFSET_CAPTURE)) {
|
1163: | static::reportInvalidArgument(\sprintf(
|
1164: | $message ?: 'The value %s matches the pattern %s (at offset %d).',
|
1165: | static::valueToString($value),
|
1166: | static::valueToString($pattern),
|
1167: | $matches[0][1]
|
1168: | ));
|
1169: | }
|
1170: | }
|
1171: |
|
1172: | |
1173: | |
1174: | |
1175: | |
1176: | |
1177: | |
1178: | |
1179: |
|
1180: | public static function unicodeLetters($value, $message = '')
|
1181: | {
|
1182: | static::string($value);
|
1183: |
|
1184: | if (!\preg_match('/^\p{L}+$/u', $value)) {
|
1185: | static::reportInvalidArgument(\sprintf(
|
1186: | $message ?: 'Expected a value to contain only Unicode letters. Got: %s',
|
1187: | static::valueToString($value)
|
1188: | ));
|
1189: | }
|
1190: | }
|
1191: |
|
1192: | |
1193: | |
1194: | |
1195: | |
1196: | |
1197: | |
1198: | |
1199: |
|
1200: | public static function alpha($value, $message = '')
|
1201: | {
|
1202: | static::string($value);
|
1203: |
|
1204: | $locale = \setlocale(LC_CTYPE, 0);
|
1205: | \setlocale(LC_CTYPE, 'C');
|
1206: | $valid = !\ctype_alpha($value);
|
1207: | \setlocale(LC_CTYPE, $locale);
|
1208: |
|
1209: | if ($valid) {
|
1210: | static::reportInvalidArgument(\sprintf(
|
1211: | $message ?: 'Expected a value to contain only letters. Got: %s',
|
1212: | static::valueToString($value)
|
1213: | ));
|
1214: | }
|
1215: | }
|
1216: |
|
1217: | |
1218: | |
1219: | |
1220: | |
1221: | |
1222: | |
1223: | |
1224: |
|
1225: | public static function digits($value, $message = '')
|
1226: | {
|
1227: | $locale = \setlocale(LC_CTYPE, 0);
|
1228: | \setlocale(LC_CTYPE, 'C');
|
1229: | $valid = !\ctype_digit($value);
|
1230: | \setlocale(LC_CTYPE, $locale);
|
1231: |
|
1232: | if ($valid) {
|
1233: | static::reportInvalidArgument(\sprintf(
|
1234: | $message ?: 'Expected a value to contain digits only. Got: %s',
|
1235: | static::valueToString($value)
|
1236: | ));
|
1237: | }
|
1238: | }
|
1239: |
|
1240: | |
1241: | |
1242: | |
1243: | |
1244: | |
1245: | |
1246: | |
1247: |
|
1248: | public static function alnum($value, $message = '')
|
1249: | {
|
1250: | $locale = \setlocale(LC_CTYPE, 0);
|
1251: | \setlocale(LC_CTYPE, 'C');
|
1252: | $valid = !\ctype_alnum($value);
|
1253: | \setlocale(LC_CTYPE, $locale);
|
1254: |
|
1255: | if ($valid) {
|
1256: | static::reportInvalidArgument(\sprintf(
|
1257: | $message ?: 'Expected a value to contain letters and digits only. Got: %s',
|
1258: | static::valueToString($value)
|
1259: | ));
|
1260: | }
|
1261: | }
|
1262: |
|
1263: | |
1264: | |
1265: | |
1266: | |
1267: | |
1268: | |
1269: | |
1270: | |
1271: |
|
1272: | public static function lower($value, $message = '')
|
1273: | {
|
1274: | $locale = \setlocale(LC_CTYPE, 0);
|
1275: | \setlocale(LC_CTYPE, 'C');
|
1276: | $valid = !\ctype_lower($value);
|
1277: | \setlocale(LC_CTYPE, $locale);
|
1278: |
|
1279: | if ($valid) {
|
1280: | static::reportInvalidArgument(\sprintf(
|
1281: | $message ?: 'Expected a value to contain lowercase characters only. Got: %s',
|
1282: | static::valueToString($value)
|
1283: | ));
|
1284: | }
|
1285: | }
|
1286: |
|
1287: | |
1288: | |
1289: | |
1290: | |
1291: | |
1292: | |
1293: | |
1294: | |
1295: |
|
1296: | public static function upper($value, $message = '')
|
1297: | {
|
1298: | $locale = \setlocale(LC_CTYPE, 0);
|
1299: | \setlocale(LC_CTYPE, 'C');
|
1300: | $valid = !\ctype_upper($value);
|
1301: | \setlocale(LC_CTYPE, $locale);
|
1302: |
|
1303: | if ($valid) {
|
1304: | static::reportInvalidArgument(\sprintf(
|
1305: | $message ?: 'Expected a value to contain uppercase characters only. Got: %s',
|
1306: | static::valueToString($value)
|
1307: | ));
|
1308: | }
|
1309: | }
|
1310: |
|
1311: | |
1312: | |
1313: | |
1314: | |
1315: | |
1316: | |
1317: | |
1318: | |
1319: |
|
1320: | public static function length($value, $length, $message = '')
|
1321: | {
|
1322: | if ($length !== static::strlen($value)) {
|
1323: | static::reportInvalidArgument(\sprintf(
|
1324: | $message ?: 'Expected a value to contain %2$s characters. Got: %s',
|
1325: | static::valueToString($value),
|
1326: | $length
|
1327: | ));
|
1328: | }
|
1329: | }
|
1330: |
|
1331: | |
1332: | |
1333: | |
1334: | |
1335: | |
1336: | |
1337: | |
1338: | |
1339: | |
1340: | |
1341: |
|
1342: | public static function minLength($value, $min, $message = '')
|
1343: | {
|
1344: | if (static::strlen($value) < $min) {
|
1345: | static::reportInvalidArgument(\sprintf(
|
1346: | $message ?: 'Expected a value to contain at least %2$s characters. Got: %s',
|
1347: | static::valueToString($value),
|
1348: | $min
|
1349: | ));
|
1350: | }
|
1351: | }
|
1352: |
|
1353: | |
1354: | |
1355: | |
1356: | |
1357: | |
1358: | |
1359: | |
1360: | |
1361: | |
1362: | |
1363: |
|
1364: | public static function maxLength($value, $max, $message = '')
|
1365: | {
|
1366: | if (static::strlen($value) > $max) {
|
1367: | static::reportInvalidArgument(\sprintf(
|
1368: | $message ?: 'Expected a value to contain at most %2$s characters. Got: %s',
|
1369: | static::valueToString($value),
|
1370: | $max
|
1371: | ));
|
1372: | }
|
1373: | }
|
1374: |
|
1375: | |
1376: | |
1377: | |
1378: | |
1379: | |
1380: | |
1381: | |
1382: | |
1383: | |
1384: | |
1385: | |
1386: |
|
1387: | public static function lengthBetween($value, $min, $max, $message = '')
|
1388: | {
|
1389: | $length = static::strlen($value);
|
1390: |
|
1391: | if ($length < $min || $length > $max) {
|
1392: | static::reportInvalidArgument(\sprintf(
|
1393: | $message ?: 'Expected a value to contain between %2$s and %3$s characters. Got: %s',
|
1394: | static::valueToString($value),
|
1395: | $min,
|
1396: | $max
|
1397: | ));
|
1398: | }
|
1399: | }
|
1400: |
|
1401: | |
1402: | |
1403: | |
1404: | |
1405: | |
1406: | |
1407: | |
1408: |
|
1409: | public static function fileExists($value, $message = '')
|
1410: | {
|
1411: | static::string($value);
|
1412: |
|
1413: | if (!\file_exists($value)) {
|
1414: | static::reportInvalidArgument(\sprintf(
|
1415: | $message ?: 'The file %s does not exist.',
|
1416: | static::valueToString($value)
|
1417: | ));
|
1418: | }
|
1419: | }
|
1420: |
|
1421: | |
1422: | |
1423: | |
1424: | |
1425: | |
1426: |
|
1427: | public static function file($value, $message = '')
|
1428: | {
|
1429: | static::fileExists($value, $message);
|
1430: |
|
1431: | if (!\is_file($value)) {
|
1432: | static::reportInvalidArgument(\sprintf(
|
1433: | $message ?: 'The path %s is not a file.',
|
1434: | static::valueToString($value)
|
1435: | ));
|
1436: | }
|
1437: | }
|
1438: |
|
1439: | |
1440: | |
1441: | |
1442: | |
1443: | |
1444: |
|
1445: | public static function directory($value, $message = '')
|
1446: | {
|
1447: | static::fileExists($value, $message);
|
1448: |
|
1449: | if (!\is_dir($value)) {
|
1450: | static::reportInvalidArgument(\sprintf(
|
1451: | $message ?: 'The path %s is no directory.',
|
1452: | static::valueToString($value)
|
1453: | ));
|
1454: | }
|
1455: | }
|
1456: |
|
1457: | |
1458: | |
1459: | |
1460: | |
1461: | |
1462: |
|
1463: | public static function readable($value, $message = '')
|
1464: | {
|
1465: | if (!\is_readable($value)) {
|
1466: | static::reportInvalidArgument(\sprintf(
|
1467: | $message ?: 'The path %s is not readable.',
|
1468: | static::valueToString($value)
|
1469: | ));
|
1470: | }
|
1471: | }
|
1472: |
|
1473: | |
1474: | |
1475: | |
1476: | |
1477: | |
1478: |
|
1479: | public static function writable($value, $message = '')
|
1480: | {
|
1481: | if (!\is_writable($value)) {
|
1482: | static::reportInvalidArgument(\sprintf(
|
1483: | $message ?: 'The path %s is not writable.',
|
1484: | static::valueToString($value)
|
1485: | ));
|
1486: | }
|
1487: | }
|
1488: |
|
1489: | |
1490: | |
1491: | |
1492: | |
1493: | |
1494: | |
1495: | |
1496: |
|
1497: | public static function classExists($value, $message = '')
|
1498: | {
|
1499: | if (!\class_exists($value)) {
|
1500: | static::reportInvalidArgument(\sprintf(
|
1501: | $message ?: 'Expected an existing class name. Got: %s',
|
1502: | static::valueToString($value)
|
1503: | ));
|
1504: | }
|
1505: | }
|
1506: |
|
1507: | |
1508: | |
1509: | |
1510: | |
1511: | |
1512: | |
1513: | |
1514: | |
1515: | |
1516: | |
1517: | |
1518: |
|
1519: | public static function subclassOf($value, $class, $message = '')
|
1520: | {
|
1521: | if (!\is_subclass_of($value, $class)) {
|
1522: | static::reportInvalidArgument(\sprintf(
|
1523: | $message ?: 'Expected a sub-class of %2$s. Got: %s',
|
1524: | static::valueToString($value),
|
1525: | static::valueToString($class)
|
1526: | ));
|
1527: | }
|
1528: | }
|
1529: |
|
1530: | |
1531: | |
1532: | |
1533: | |
1534: | |
1535: | |
1536: | |
1537: |
|
1538: | public static function interfaceExists($value, $message = '')
|
1539: | {
|
1540: | if (!\interface_exists($value)) {
|
1541: | static::reportInvalidArgument(\sprintf(
|
1542: | $message ?: 'Expected an existing interface name. got %s',
|
1543: | static::valueToString($value)
|
1544: | ));
|
1545: | }
|
1546: | }
|
1547: |
|
1548: | |
1549: | |
1550: | |
1551: | |
1552: | |
1553: | |
1554: | |
1555: | |
1556: | |
1557: | |
1558: | |
1559: |
|
1560: | public static function implementsInterface($value, $interface, $message = '')
|
1561: | {
|
1562: | if (!\in_array($interface, \class_implements($value))) {
|
1563: | static::reportInvalidArgument(\sprintf(
|
1564: | $message ?: 'Expected an implementation of %2$s. Got: %s',
|
1565: | static::valueToString($value),
|
1566: | static::valueToString($interface)
|
1567: | ));
|
1568: | }
|
1569: | }
|
1570: |
|
1571: | |
1572: | |
1573: | |
1574: | |
1575: | |
1576: | |
1577: | |
1578: | |
1579: | |
1580: |
|
1581: | public static function propertyExists($classOrObject, $property, $message = '')
|
1582: | {
|
1583: | if (!\property_exists($classOrObject, $property)) {
|
1584: | static::reportInvalidArgument(\sprintf(
|
1585: | $message ?: 'Expected the property %s to exist.',
|
1586: | static::valueToString($property)
|
1587: | ));
|
1588: | }
|
1589: | }
|
1590: |
|
1591: | |
1592: | |
1593: | |
1594: | |
1595: | |
1596: | |
1597: | |
1598: | |
1599: | |
1600: |
|
1601: | public static function propertyNotExists($classOrObject, $property, $message = '')
|
1602: | {
|
1603: | if (\property_exists($classOrObject, $property)) {
|
1604: | static::reportInvalidArgument(\sprintf(
|
1605: | $message ?: 'Expected the property %s to not exist.',
|
1606: | static::valueToString($property)
|
1607: | ));
|
1608: | }
|
1609: | }
|
1610: |
|
1611: | |
1612: | |
1613: | |
1614: | |
1615: | |
1616: | |
1617: | |
1618: | |
1619: | |
1620: |
|
1621: | public static function methodExists($classOrObject, $method, $message = '')
|
1622: | {
|
1623: | if (!(\is_string($classOrObject) || \is_object($classOrObject)) || !\method_exists($classOrObject, $method)) {
|
1624: | static::reportInvalidArgument(\sprintf(
|
1625: | $message ?: 'Expected the method %s to exist.',
|
1626: | static::valueToString($method)
|
1627: | ));
|
1628: | }
|
1629: | }
|
1630: |
|
1631: | |
1632: | |
1633: | |
1634: | |
1635: | |
1636: | |
1637: | |
1638: | |
1639: | |
1640: |
|
1641: | public static function methodNotExists($classOrObject, $method, $message = '')
|
1642: | {
|
1643: | if ((\is_string($classOrObject) || \is_object($classOrObject)) && \method_exists($classOrObject, $method)) {
|
1644: | static::reportInvalidArgument(\sprintf(
|
1645: | $message ?: 'Expected the method %s to not exist.',
|
1646: | static::valueToString($method)
|
1647: | ));
|
1648: | }
|
1649: | }
|
1650: |
|
1651: | |
1652: | |
1653: | |
1654: | |
1655: | |
1656: | |
1657: | |
1658: | |
1659: |
|
1660: | public static function keyExists($array, $key, $message = '')
|
1661: | {
|
1662: | if (!(isset($array[$key]) || \array_key_exists($key, $array))) {
|
1663: | static::reportInvalidArgument(\sprintf(
|
1664: | $message ?: 'Expected the key %s to exist.',
|
1665: | static::valueToString($key)
|
1666: | ));
|
1667: | }
|
1668: | }
|
1669: |
|
1670: | |
1671: | |
1672: | |
1673: | |
1674: | |
1675: | |
1676: | |
1677: | |
1678: |
|
1679: | public static function keyNotExists($array, $key, $message = '')
|
1680: | {
|
1681: | if (isset($array[$key]) || \array_key_exists($key, $array)) {
|
1682: | static::reportInvalidArgument(\sprintf(
|
1683: | $message ?: 'Expected the key %s to not exist.',
|
1684: | static::valueToString($key)
|
1685: | ));
|
1686: | }
|
1687: | }
|
1688: |
|
1689: | |
1690: | |
1691: | |
1692: | |
1693: | |
1694: | |
1695: | |
1696: | |
1697: | |
1698: | |
1699: |
|
1700: | public static function validArrayKey($value, $message = '')
|
1701: | {
|
1702: | if (!(\is_int($value) || \is_string($value))) {
|
1703: | static::reportInvalidArgument(\sprintf(
|
1704: | $message ?: 'Expected string or integer. Got: %s',
|
1705: | static::typeToString($value)
|
1706: | ));
|
1707: | }
|
1708: | }
|
1709: |
|
1710: | |
1711: | |
1712: | |
1713: | |
1714: | |
1715: | |
1716: | |
1717: | |
1718: |
|
1719: | public static function count($array, $number, $message = '')
|
1720: | {
|
1721: | static::eq(
|
1722: | \count($array),
|
1723: | $number,
|
1724: | \sprintf(
|
1725: | $message ?: 'Expected an array to contain %d elements. Got: %d.',
|
1726: | $number,
|
1727: | \count($array)
|
1728: | )
|
1729: | );
|
1730: | }
|
1731: |
|
1732: | |
1733: | |
1734: | |
1735: | |
1736: | |
1737: | |
1738: | |
1739: | |
1740: |
|
1741: | public static function minCount($array, $min, $message = '')
|
1742: | {
|
1743: | if (\count($array) < $min) {
|
1744: | static::reportInvalidArgument(\sprintf(
|
1745: | $message ?: 'Expected an array to contain at least %2$d elements. Got: %d',
|
1746: | \count($array),
|
1747: | $min
|
1748: | ));
|
1749: | }
|
1750: | }
|
1751: |
|
1752: | |
1753: | |
1754: | |
1755: | |
1756: | |
1757: | |
1758: | |
1759: | |
1760: |
|
1761: | public static function maxCount($array, $max, $message = '')
|
1762: | {
|
1763: | if (\count($array) > $max) {
|
1764: | static::reportInvalidArgument(\sprintf(
|
1765: | $message ?: 'Expected an array to contain at most %2$d elements. Got: %d',
|
1766: | \count($array),
|
1767: | $max
|
1768: | ));
|
1769: | }
|
1770: | }
|
1771: |
|
1772: | |
1773: | |
1774: | |
1775: | |
1776: | |
1777: | |
1778: | |
1779: | |
1780: | |
1781: |
|
1782: | public static function countBetween($array, $min, $max, $message = '')
|
1783: | {
|
1784: | $count = \count($array);
|
1785: |
|
1786: | if ($count < $min || $count > $max) {
|
1787: | static::reportInvalidArgument(\sprintf(
|
1788: | $message ?: 'Expected an array to contain between %2$d and %3$d elements. Got: %d',
|
1789: | $count,
|
1790: | $min,
|
1791: | $max
|
1792: | ));
|
1793: | }
|
1794: | }
|
1795: |
|
1796: | |
1797: | |
1798: | |
1799: | |
1800: | |
1801: | |
1802: | |
1803: | |
1804: |
|
1805: | public static function isList($array, $message = '')
|
1806: | {
|
1807: | if (!\is_array($array) || $array !== \array_values($array)) {
|
1808: | static::reportInvalidArgument(
|
1809: | $message ?: 'Expected list - non-associative array.'
|
1810: | );
|
1811: | }
|
1812: | }
|
1813: |
|
1814: | |
1815: | |
1816: | |
1817: | |
1818: | |
1819: | |
1820: | |
1821: | |
1822: |
|
1823: | public static function isNonEmptyList($array, $message = '')
|
1824: | {
|
1825: | static::isList($array, $message);
|
1826: | static::notEmpty($array, $message);
|
1827: | }
|
1828: |
|
1829: | |
1830: | |
1831: | |
1832: | |
1833: | |
1834: | |
1835: | |
1836: | |
1837: | |
1838: | |
1839: |
|
1840: | public static function isMap($array, $message = '')
|
1841: | {
|
1842: | if (
|
1843: | !\is_array($array) ||
|
1844: | \array_keys($array) !== \array_filter(\array_keys($array), '\is_string')
|
1845: | ) {
|
1846: | static::reportInvalidArgument(
|
1847: | $message ?: 'Expected map - associative array with string keys.'
|
1848: | );
|
1849: | }
|
1850: | }
|
1851: |
|
1852: | |
1853: | |
1854: | |
1855: | |
1856: | |
1857: | |
1858: | |
1859: | |
1860: | |
1861: | |
1862: | |
1863: |
|
1864: | public static function isNonEmptyMap($array, $message = '')
|
1865: | {
|
1866: | static::isMap($array, $message);
|
1867: | static::notEmpty($array, $message);
|
1868: | }
|
1869: |
|
1870: | |
1871: | |
1872: | |
1873: | |
1874: | |
1875: | |
1876: | |
1877: |
|
1878: | public static function uuid($value, $message = '')
|
1879: | {
|
1880: | $value = \str_replace(array('urn:', 'uuid:', '{', '}'), '', $value);
|
1881: |
|
1882: |
|
1883: |
|
1884: | if ('00000000-0000-0000-0000-000000000000' === $value) {
|
1885: | return;
|
1886: | }
|
1887: |
|
1888: | if (!\preg_match('/^[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}$/', $value)) {
|
1889: | static::reportInvalidArgument(\sprintf(
|
1890: | $message ?: 'Value %s is not a valid UUID.',
|
1891: | static::valueToString($value)
|
1892: | ));
|
1893: | }
|
1894: | }
|
1895: |
|
1896: | |
1897: | |
1898: | |
1899: | |
1900: | |
1901: | |
1902: | |
1903: | |
1904: |
|
1905: | public static function throws(Closure $expression, $class = 'Exception', $message = '')
|
1906: | {
|
1907: | static::string($class);
|
1908: |
|
1909: | $actual = 'none';
|
1910: |
|
1911: | try {
|
1912: | $expression();
|
1913: | } catch (Exception $e) {
|
1914: | $actual = \get_class($e);
|
1915: | if ($e instanceof $class) {
|
1916: | return;
|
1917: | }
|
1918: | } catch (Throwable $e) {
|
1919: | $actual = \get_class($e);
|
1920: | if ($e instanceof $class) {
|
1921: | return;
|
1922: | }
|
1923: | }
|
1924: |
|
1925: | static::reportInvalidArgument($message ?: \sprintf(
|
1926: | 'Expected to throw "%s", got "%s"',
|
1927: | $class,
|
1928: | $actual
|
1929: | ));
|
1930: | }
|
1931: |
|
1932: | |
1933: | |
1934: |
|
1935: | public static function __callStatic($name, $arguments)
|
1936: | {
|
1937: | if ('nullOr' === \substr($name, 0, 6)) {
|
1938: | if (null !== $arguments[0]) {
|
1939: | $method = \lcfirst(\substr($name, 6));
|
1940: | \call_user_func_array(array('static', $method), $arguments);
|
1941: | }
|
1942: |
|
1943: | return;
|
1944: | }
|
1945: |
|
1946: | if ('all' === \substr($name, 0, 3)) {
|
1947: | static::isIterable($arguments[0]);
|
1948: |
|
1949: | $method = \lcfirst(\substr($name, 3));
|
1950: | $args = $arguments;
|
1951: |
|
1952: | foreach ($arguments[0] as $entry) {
|
1953: | $args[0] = $entry;
|
1954: |
|
1955: | \call_user_func_array(array('static', $method), $args);
|
1956: | }
|
1957: |
|
1958: | return;
|
1959: | }
|
1960: |
|
1961: | throw new BadMethodCallException('No such method: '.$name);
|
1962: | }
|
1963: |
|
1964: | |
1965: | |
1966: | |
1967: | |
1968: |
|
1969: | protected static function valueToString($value)
|
1970: | {
|
1971: | if (null === $value) {
|
1972: | return 'null';
|
1973: | }
|
1974: |
|
1975: | if (true === $value) {
|
1976: | return 'true';
|
1977: | }
|
1978: |
|
1979: | if (false === $value) {
|
1980: | return 'false';
|
1981: | }
|
1982: |
|
1983: | if (\is_array($value)) {
|
1984: | return 'array';
|
1985: | }
|
1986: |
|
1987: | if (\is_object($value)) {
|
1988: | if (\method_exists($value, '__toString')) {
|
1989: | return \get_class($value).': '.self::valueToString($value->__toString());
|
1990: | }
|
1991: |
|
1992: | if ($value instanceof DateTime || $value instanceof DateTimeImmutable) {
|
1993: | return \get_class($value).': '.self::valueToString($value->format('c'));
|
1994: | }
|
1995: |
|
1996: | return \get_class($value);
|
1997: | }
|
1998: |
|
1999: | if (\is_resource($value)) {
|
2000: | return 'resource';
|
2001: | }
|
2002: |
|
2003: | if (\is_string($value)) {
|
2004: | return '"'.$value.'"';
|
2005: | }
|
2006: |
|
2007: | return (string) $value;
|
2008: | }
|
2009: |
|
2010: | |
2011: | |
2012: | |
2013: | |
2014: |
|
2015: | protected static function typeToString($value)
|
2016: | {
|
2017: | return \is_object($value) ? \get_class($value) : \gettype($value);
|
2018: | }
|
2019: |
|
2020: | protected static function strlen($value)
|
2021: | {
|
2022: | if (!\function_exists('mb_detect_encoding')) {
|
2023: | return \strlen($value);
|
2024: | }
|
2025: |
|
2026: | if (false === $encoding = \mb_detect_encoding($value)) {
|
2027: | return \strlen($value);
|
2028: | }
|
2029: |
|
2030: | return \mb_strlen($value, $encoding);
|
2031: | }
|
2032: |
|
2033: | |
2034: | |
2035: | |
2036: | |
2037: | |
2038: | |
2039: |
|
2040: | protected static function reportInvalidArgument($message)
|
2041: | {
|
2042: | throw new InvalidArgumentException($message);
|
2043: | }
|
2044: |
|
2045: | private function __construct()
|
2046: | {
|
2047: | }
|
2048: | }
|
2049: | |