~tcuthbert/wordpress/openstack-objectstorage

« back to all changes in this revision

Viewing changes to vendor/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Static.php

  • Committer: Jacek Nykis
  • Date: 2015-02-11 15:35:31 UTC
  • Revision ID: jacek.nykis@canonical.com-20150211153531-hmy6zi0ov2qfkl0b
Initial commit

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<?php
 
2
/**
 
3
 * PHPUnit
 
4
 *
 
5
 * Copyright (c) 2010-2014, Sebastian Bergmann <sebastian@phpunit.de>.
 
6
 * All rights reserved.
 
7
 *
 
8
 * Redistribution and use in source and binary forms, with or without
 
9
 * modification, are permitted provided that the following conditions
 
10
 * are met:
 
11
 *
 
12
 *   * Redistributions of source code must retain the above copyright
 
13
 *     notice, this list of conditions and the following disclaimer.
 
14
 *
 
15
 *   * Redistributions in binary form must reproduce the above copyright
 
16
 *     notice, this list of conditions and the following disclaimer in
 
17
 *     the documentation and/or other materials provided with the
 
18
 *     distribution.
 
19
 *
 
20
 *   * Neither the name of Sebastian Bergmann nor the names of his
 
21
 *     contributors may be used to endorse or promote products derived
 
22
 *     from this software without specific prior written permission.
 
23
 *
 
24
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 
25
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 
26
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 
27
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 
28
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 
29
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 
30
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 
31
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 
32
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 
33
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 
34
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 
35
 * POSSIBILITY OF SUCH DAMAGE.
 
36
 *
 
37
 * @package    PHPUnit_MockObject
 
38
 * @author     Sebastian Bergmann <sebastian@phpunit.de>
 
39
 * @copyright  2010-2014 Sebastian Bergmann <sebastian@phpunit.de>
 
40
 * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
 
41
 * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
 
42
 * @since      File available since Release 1.0.0
 
43
 */
 
44
 
 
45
use SebastianBergmann\Exporter\Exporter;
 
46
 
 
47
/**
 
48
 * Represents a static invocation.
 
49
 *
 
50
 * @package    PHPUnit_MockObject
 
51
 * @author     Sebastian Bergmann <sebastian@phpunit.de>
 
52
 * @copyright  2010-2014 Sebastian Bergmann <sebastian@phpunit.de>
 
53
 * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
 
54
 * @version    Release: @package_version@
 
55
 * @link       http://github.com/sebastianbergmann/phpunit-mock-objects
 
56
 * @since      Class available since Release 1.0.0
 
57
 */
 
58
class PHPUnit_Framework_MockObject_Invocation_Static implements PHPUnit_Framework_MockObject_Invocation, PHPUnit_Framework_SelfDescribing
 
59
{
 
60
    /**
 
61
     * @var array
 
62
     */
 
63
    protected static $uncloneableExtensions = array(
 
64
      'mysqli' => TRUE,
 
65
      'SQLite' => TRUE,
 
66
      'sqlite3' => TRUE,
 
67
      'tidy' => TRUE,
 
68
      'xmlwriter' => TRUE,
 
69
      'xsl' => TRUE
 
70
    );
 
71
 
 
72
    /**
 
73
     * @var array
 
74
     */
 
75
    protected static $uncloneableClasses = array(
 
76
      'Closure',
 
77
      'COMPersistHelper',
 
78
      'IteratorIterator',
 
79
      'RecursiveIteratorIterator',
 
80
      'SplFileObject',
 
81
      'PDORow',
 
82
      'ZipArchive'
 
83
    );
 
84
 
 
85
    /**
 
86
     * @var string
 
87
     */
 
88
    public $className;
 
89
 
 
90
    /**
 
91
     * @var string
 
92
     */
 
93
    public $methodName;
 
94
 
 
95
    /**
 
96
     * @var array
 
97
     */
 
98
    public $parameters;
 
99
 
 
100
    /**
 
101
     * @param string  $className
 
102
     * @param string  $methodname
 
103
     * @param array   $parameters
 
104
     * @param boolean $cloneObjects
 
105
     */
 
106
    public function __construct($className, $methodName, array $parameters, $cloneObjects = FALSE)
 
107
    {
 
108
        $this->className  = $className;
 
109
        $this->methodName = $methodName;
 
110
        $this->parameters = $parameters;
 
111
 
 
112
        if (!$cloneObjects) {
 
113
            return;
 
114
        }
 
115
 
 
116
        foreach ($this->parameters as $key => $value) {
 
117
            if (is_object($value)) {
 
118
                $this->parameters[$key] = $this->cloneObject($value);
 
119
            }
 
120
        }
 
121
    }
 
122
 
 
123
    /**
 
124
     * @return string
 
125
     */
 
126
    public function toString()
 
127
    {
 
128
        $exporter = new Exporter;
 
129
 
 
130
        return sprintf(
 
131
          "%s::%s(%s)",
 
132
 
 
133
          $this->className,
 
134
          $this->methodName,
 
135
          join(
 
136
            ', ',
 
137
            array_map(
 
138
              array($exporter, 'shortenedExport'),
 
139
              $this->parameters
 
140
            )
 
141
          )
 
142
        );
 
143
    }
 
144
 
 
145
    /**
 
146
     * @param  object $original
 
147
     * @return object
 
148
     */
 
149
    protected function cloneObject($original)
 
150
    {
 
151
        $cloneable = NULL;
 
152
        $object    = new ReflectionObject($original);
 
153
 
 
154
        // Check the blacklist before asking PHP reflection to work around
 
155
        // https://bugs.php.net/bug.php?id=53967
 
156
        if ($object->isInternal() &&
 
157
            isset(self::$uncloneableExtensions[$object->getExtensionName()])) {
 
158
            $cloneable = FALSE;
 
159
        }
 
160
 
 
161
        if ($cloneable === NULL) {
 
162
            foreach (self::$uncloneableClasses as $class) {
 
163
                if ($original instanceof $class) {
 
164
                    $cloneable = FALSE;
 
165
                    break;
 
166
                }
 
167
            }
 
168
        }
 
169
 
 
170
        if ($cloneable === NULL && method_exists($object, 'isCloneable')) {
 
171
            $cloneable = $object->isCloneable();
 
172
        }
 
173
 
 
174
        if ($cloneable === NULL && $object->hasMethod('__clone')) {
 
175
            $method    = $object->getMethod('__clone');
 
176
            $cloneable = $method->isPublic();
 
177
        }
 
178
 
 
179
        if ($cloneable === NULL) {
 
180
            $cloneable = TRUE;
 
181
        }
 
182
 
 
183
        if ($cloneable) {
 
184
            try {
 
185
                return clone $original;
 
186
            } catch (Exception $e) {
 
187
                return $original;
 
188
            }
 
189
        } else {
 
190
            return $original;
 
191
        }
 
192
    }
 
193
}