Failed Conditions
Push — master ( 8ded6a...b2fb92 )
by Arnold
03:23
created

CallbackMockTrait   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 52
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 13
c 0
b 0
f 0
dl 0
loc 52
ccs 13
cts 13
cp 1
rs 10
wmc 7

1 Method

Rating   Name   Duplication   Size   Complexity  
B createCallbackMock() 0 19 7
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Jasny\PHPUnit;
6
7
use Jasny\PHPUnit\Util\DummyCallback;
8
use PHPUnit\Framework\MockObject\MockObject;
9
use PHPUnit\Framework\MockObject\MockBuilder;
10
use PHPUnit\Framework\MockObject\Rule\InvocationOrder;
11
12
/**
13
 * Trait to create a mock for a callback.
14
 */
15
trait CallbackMockTrait
16
{
17
    /**
18
     * Returns a builder object to create mock objects using a fluent interface.
19
     *
20
     * @param string $className
21
     * @return MockBuilder
22
     */
23
    abstract public function getMockBuilder($className): MockBuilder;
24
25
    /**
26
     * Create mock for next callback.
27
     *
28
     * <code>
29
     *   $callback = $this->createCallbackMock($this->once(), ['abc'], 10);
30
     * </code>
31
     *
32
     * OR
33
     *
34
     * <code>
35
     *   $callback = $this->createCallbackMock(
36
     *     $this->once(),
37
     *     function(InvocationMocker $invoke) {
38
     *       $invoke->with('abc')->willReturn(10);
39
     *     }
40
     *   );
41
     * </code>
42
     *
43
     * @param InvocationOrder     $matcher
44
     * @param \Closure|array|null $assert
45
     * @param mixed               $return
46
     * @return MockObject|callable
47
     */
48 7
    protected function createCallbackMock($matcher, $assert = null, $return = null): MockObject
49
    {
50 7
        if (isset($assert) && !is_array($assert) && !$assert instanceof \Closure) {
1 ignored issue
show
introduced by
$assert is always a sub-type of Closure.
Loading history...
51 1
            $type = (is_object($assert) ? get_class($assert) . ' ' : '') . gettype($assert);
52 1
            throw new \InvalidArgumentException("Expected an array or Closure, got a $type");
53
        }
54
55 6
        $callback = $this->getMockBuilder(DummyCallback::class)
56 6
            ->setMockClassName('CallbackMock_' . \substr(\md5((string) \mt_rand()), 0, 8))
57 6
            ->getMock();
58 6
        $invoke = $callback->expects($matcher)->method('__invoke');
59
        
60 6
        if ($assert instanceof \Closure) {
61 2
            $assert($invoke);
62 4
        } elseif (is_array($assert)) {
63 2
            $invoke->with(...$assert)->willReturn($return);
64
        }
65
        
66 6
        return $callback;
67
    }
68
}
69