3d295e59961e40d866def9332ac2e6d77b055bd4
[yaffs-website] / vendor / phpunit / phpunit-mock-objects / src / Framework / MockObject / Invocation / Static.php
1 <?php
2 /*
3  * This file is part of the PHPUnit_MockObject package.
4  *
5  * (c) Sebastian Bergmann <sebastian@phpunit.de>
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 use SebastianBergmann\Exporter\Exporter;
12
13 /**
14  * Represents a static invocation.
15  *
16  * @since Class available since Release 1.0.0
17  */
18 class PHPUnit_Framework_MockObject_Invocation_Static implements PHPUnit_Framework_MockObject_Invocation, PHPUnit_Framework_SelfDescribing
19 {
20     /**
21      * @var array
22      */
23     protected static $uncloneableExtensions = array(
24       'mysqli'    => true,
25       'SQLite'    => true,
26       'sqlite3'   => true,
27       'tidy'      => true,
28       'xmlwriter' => true,
29       'xsl'       => true
30     );
31
32     /**
33      * @var array
34      */
35     protected static $uncloneableClasses = array(
36       'Closure',
37       'COMPersistHelper',
38       'IteratorIterator',
39       'RecursiveIteratorIterator',
40       'SplFileObject',
41       'PDORow',
42       'ZipArchive'
43     );
44
45     /**
46      * @var string
47      */
48     public $className;
49
50     /**
51      * @var string
52      */
53     public $methodName;
54
55     /**
56      * @var array
57      */
58     public $parameters;
59
60     /**
61      * @param string $className
62      * @param string $methodname
63      * @param array  $parameters
64      * @param bool   $cloneObjects
65      */
66     public function __construct($className, $methodName, array $parameters, $cloneObjects = false)
67     {
68         $this->className  = $className;
69         $this->methodName = $methodName;
70         $this->parameters = $parameters;
71
72         if (!$cloneObjects) {
73             return;
74         }
75
76         foreach ($this->parameters as $key => $value) {
77             if (is_object($value)) {
78                 $this->parameters[$key] = $this->cloneObject($value);
79             }
80         }
81     }
82
83     /**
84      * @return string
85      */
86     public function toString()
87     {
88         $exporter = new Exporter;
89
90         return sprintf(
91             '%s::%s(%s)',
92             $this->className,
93             $this->methodName,
94             implode(
95                 ', ',
96                 array_map(
97                     array($exporter, 'shortenedExport'),
98                     $this->parameters
99                 )
100             )
101         );
102     }
103
104     /**
105      * @param  object $original
106      * @return object
107      */
108     protected function cloneObject($original)
109     {
110         $cloneable = null;
111         $object    = new ReflectionObject($original);
112
113         // Check the blacklist before asking PHP reflection to work around
114         // https://bugs.php.net/bug.php?id=53967
115         if ($object->isInternal() &&
116             isset(self::$uncloneableExtensions[$object->getExtensionName()])) {
117             $cloneable = false;
118         }
119
120         if ($cloneable === null) {
121             foreach (self::$uncloneableClasses as $class) {
122                 if ($original instanceof $class) {
123                     $cloneable = false;
124                     break;
125                 }
126             }
127         }
128
129         if ($cloneable === null && method_exists($object, 'isCloneable')) {
130             $cloneable = $object->isCloneable();
131         }
132
133         if ($cloneable === null && $object->hasMethod('__clone')) {
134             $method    = $object->getMethod('__clone');
135             $cloneable = $method->isPublic();
136         }
137
138         if ($cloneable === null) {
139             $cloneable = true;
140         }
141
142         if ($cloneable) {
143             try {
144                 return clone $original;
145             } catch (Exception $e) {
146                 return $original;
147             }
148         } else {
149             return $original;
150         }
151     }
152 }