Seditio Source
Root |
./othercms/croogo-4.0.7/vendor/phpunit/phpunit-mock-objects/tests/MockObjectTest.php
<?php
/*
 * This file is part of the phpunit-mock-objects package.
 *
 * (c) Sebastian Bergmann <sebastian@phpunit.de>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

use PHPUnit\Framework\MockObject\MockObject;
use
PHPUnit\Framework\TestCase;
use
PHPUnit\Framework\ExpectationFailedException;

class
MockObjectTest extends TestCase
{
    public function
testMockedMethodIsNeverCalled()
    {
       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->never())
             ->
method('doSomething');
    }

    public function
testMockedMethodIsNeverCalledWithParameter()
    {
       
$mock = $this->getMockBuilder(SomeClass::class)
                     ->
getMock();

       
$mock->expects($this->never())
             ->
method('doSomething')
             ->
with('someArg');
    }

   
/**
     * @doesNotPerformAssertions
     */
   
public function testMockedMethodIsNotCalledWhenExpectsAnyWithParameter()
    {
       
$mock = $this->getMockBuilder(SomeClass::class)
                     ->
getMock();

       
$mock->expects($this->any())
             ->
method('doSomethingElse')
             ->
with('someArg');
    }

   
/**
     * @doesNotPerformAssertions
     */
   
public function testMockedMethodIsNotCalledWhenMethodSpecifiedDirectlyWithParameter()
    {
       
$mock = $this->getMockBuilder(SomeClass::class)
                     ->
getMock();

       
$mock->method('doSomethingElse')
             ->
with('someArg');
    }

    public function
testMockedMethodIsCalledAtLeastOnce()
    {
       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->atLeastOnce())
             ->
method('doSomething');

       
$mock->doSomething();
    }

    public function
testMockedMethodIsCalledAtLeastOnce2()
    {
       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->atLeastOnce())
             ->
method('doSomething');

       
$mock->doSomething();
       
$mock->doSomething();
    }

    public function
testMockedMethodIsCalledAtLeastTwice()
    {
       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->atLeast(2))
             ->
method('doSomething');

       
$mock->doSomething();
       
$mock->doSomething();
    }

    public function
testMockedMethodIsCalledAtLeastTwice2()
    {
       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->atLeast(2))
             ->
method('doSomething');

       
$mock->doSomething();
       
$mock->doSomething();
       
$mock->doSomething();
    }

    public function
testMockedMethodIsCalledAtMostTwice()
    {
       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->atMost(2))
             ->
method('doSomething');

       
$mock->doSomething();
       
$mock->doSomething();
    }

    public function
testMockedMethodIsCalledAtMosttTwice2()
    {
       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->atMost(2))
             ->
method('doSomething');

       
$mock->doSomething();
    }

    public function
testMockedMethodIsCalledOnce()
    {
       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->once())
             ->
method('doSomething');

       
$mock->doSomething();
    }

    public function
testMockedMethodIsCalledOnceWithParameter()
    {
       
$mock = $this->getMockBuilder(SomeClass::class)
                     ->
getMock();

       
$mock->expects($this->once())
             ->
method('doSomethingElse')
             ->
with($this->equalTo('something'));

       
$mock->doSomethingElse('something');
    }

    public function
testMockedMethodIsCalledExactly()
    {
       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->exactly(2))
             ->
method('doSomething');

       
$mock->doSomething();
       
$mock->doSomething();
    }

    public function
testStubbedException()
    {
       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->any())
             ->
method('doSomething')
             ->
will($this->throwException(new \Exception()));

       
$this->expectException(\Exception::class);

       
$mock->doSomething();
    }

    public function
testStubbedWillThrowException()
    {
       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->any())
             ->
method('doSomething')
             ->
willThrowException(new \Exception());

       
$this->expectException(\Exception::class);

       
$mock->doSomething();
    }

    public function
testStubbedReturnValue()
    {
       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->any())
             ->
method('doSomething')
             ->
will($this->returnValue('something'));

       
$this->assertEquals('something', $mock->doSomething());

       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->any())
             ->
method('doSomething')
             ->
willReturn('something');

       
$this->assertEquals('something', $mock->doSomething());
    }

    public function
testStubbedReturnValueMap()
    {
       
$map = [
            [
'a', 'b', 'c', 'd'],
            [
'e', 'f', 'g', 'h']
        ];

       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->any())
             ->
method('doSomething')
             ->
will($this->returnValueMap($map));

       
$this->assertEquals('d', $mock->doSomething('a', 'b', 'c'));
       
$this->assertEquals('h', $mock->doSomething('e', 'f', 'g'));
       
$this->assertEquals(null, $mock->doSomething('foo', 'bar'));

       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->any())
             ->
method('doSomething')
             ->
willReturnMap($map);

       
$this->assertEquals('d', $mock->doSomething('a', 'b', 'c'));
       
$this->assertEquals('h', $mock->doSomething('e', 'f', 'g'));
       
$this->assertEquals(null, $mock->doSomething('foo', 'bar'));
    }

    public function
testStubbedReturnArgument()
    {
       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->any())
             ->
method('doSomething')
             ->
will($this->returnArgument(1));

       
$this->assertEquals('b', $mock->doSomething('a', 'b'));

       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->any())
             ->
method('doSomething')
             ->
willReturnArgument(1);

       
$this->assertEquals('b', $mock->doSomething('a', 'b'));
    }

    public function
testFunctionCallback()
    {
       
$mock = $this->getMockBuilder(SomeClass::class)
                     ->
setMethods(['doSomething'])
                     ->
getMock();

       
$mock->expects($this->once())
             ->
method('doSomething')
             ->
will($this->returnCallback('functionCallback'));

       
$this->assertEquals('pass', $mock->doSomething('foo', 'bar'));

       
$mock = $this->getMockBuilder(SomeClass::class)
                     ->
setMethods(['doSomething'])
                     ->
getMock();

       
$mock->expects($this->once())
             ->
method('doSomething')
             ->
willReturnCallback('functionCallback');

       
$this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
    }

    public function
testStubbedReturnSelf()
    {
       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->any())
             ->
method('doSomething')
             ->
will($this->returnSelf());

       
$this->assertEquals($mock, $mock->doSomething());

       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->any())
             ->
method('doSomething')
             ->
willReturnSelf();

       
$this->assertEquals($mock, $mock->doSomething());
    }

    public function
testStubbedReturnOnConsecutiveCalls()
    {
       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->any())
             ->
method('doSomething')
             ->
will($this->onConsecutiveCalls('a', 'b', 'c'));

       
$this->assertEquals('a', $mock->doSomething());
       
$this->assertEquals('b', $mock->doSomething());
       
$this->assertEquals('c', $mock->doSomething());

       
$mock = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock->expects($this->any())
             ->
method('doSomething')
             ->
willReturnOnConsecutiveCalls('a', 'b', 'c');

       
$this->assertEquals('a', $mock->doSomething());
       
$this->assertEquals('b', $mock->doSomething());
       
$this->assertEquals('c', $mock->doSomething());
    }

    public function
testStaticMethodCallback()
    {
       
$mock = $this->getMockBuilder(SomeClass::class)
                     ->
setMethods(['doSomething'])
                     ->
getMock();

       
$mock->expects($this->once())
             ->
method('doSomething')
             ->
will($this->returnCallback(['MethodCallback', 'staticCallback']));

       
$this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
    }

    public function
testPublicMethodCallback()
    {
       
$mock = $this->getMockBuilder(SomeClass::class)
                     ->
setMethods(['doSomething'])
                     ->
getMock();

       
$mock->expects($this->once())
             ->
method('doSomething')
             ->
will($this->returnCallback([new MethodCallback, 'nonStaticCallback']));

       
$this->assertEquals('pass', $mock->doSomething('foo', 'bar'));
    }

    public function
testMockClassOnlyGeneratedOnce()
    {
       
$mock1 = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$mock2 = $this->getMockBuilder(AnInterface::class)
                     ->
getMock();

       
$this->assertEquals(get_class($mock1), get_class($mock2));
    }

    public function
testMockClassDifferentForPartialMocks()
    {
       
$mock1 = $this->getMockBuilder(PartialMockTestClass::class)
                      ->
getMock();

       
$mock2 = $this->getMockBuilder(PartialMockTestClass::class)
                      ->
setMethods(['doSomething'])
                      ->
getMock();

       
$mock3 = $this->getMockBuilder(PartialMockTestClass::class)
                      ->
setMethods(['doSomething'])
                      ->
getMock();

       
$mock4 = $this->getMockBuilder(PartialMockTestClass::class)
                      ->
setMethods(['doAnotherThing'])
                      ->
getMock();

       
$mock5 = $this->getMockBuilder(PartialMockTestClass::class)
                      ->
setMethods(['doAnotherThing'])
                      ->
getMock();

       
$this->assertNotEquals(get_class($mock1), get_class($mock2));
       
$this->assertNotEquals(get_class($mock1), get_class($mock3));
       
$this->assertNotEquals(get_class($mock1), get_class($mock4));
       
$this->assertNotEquals(get_class($mock1), get_class($mock5));
       
$this->assertEquals(get_class($mock2), get_class($mock3));
       
$this->assertNotEquals(get_class($mock2), get_class($mock4));
       
$this->assertNotEquals(get_class($mock2), get_class($mock5));
       
$this->assertEquals(get_class($mock4), get_class($mock5));
    }

    public function
testMockClassStoreOverrulable()
    {
       
$mock1 = $this->getMockBuilder(PartialMockTestClass::class)
                      ->
getMock();

       
$mock2 = $this->getMockBuilder(PartialMockTestClass::class)
                      ->
setMockClassName('MyMockClassNameForPartialMockTestClass1')
                      ->
getMock();

       
$mock3 = $this->getMockBuilder(PartialMockTestClass::class)
                      ->
getMock();

       
$mock4 = $this->getMockBuilder(PartialMockTestClass::class)
                      ->
setMethods(['doSomething'])
                      ->
setMockClassName('AnotherMockClassNameForPartialMockTestClass')
                      ->
getMock();

       
$mock5 = $this->getMockBuilder(PartialMockTestClass::class)
                      ->
setMockClassName('MyMockClassNameForPartialMockTestClass2')
                      ->
getMock();

       
$this->assertNotEquals(get_class($mock1), get_class($mock2));
       
$this->assertEquals(get_class($mock1), get_class($mock3));
       
$this->assertNotEquals(get_class($mock1), get_class($mock4));
       
$this->assertNotEquals(get_class($mock2), get_class($mock3));
       
$this->assertNotEquals(get_class($mock2), get_class($mock4));
       
$this->assertNotEquals(get_class($mock2), get_class($mock5));
       
$this->assertNotEquals(get_class($mock3), get_class($mock4));
       
$this->assertNotEquals(get_class($mock3), get_class($mock5));
       
$this->assertNotEquals(get_class($mock4), get_class($mock5));
    }

    public function
testGetMockWithFixedClassNameCanProduceTheSameMockTwice()
    {
       
$mock = $this->getMockBuilder(stdClass::class)->setMockClassName('FixedName')->getMock();
       
$mock = $this->getMockBuilder(stdClass::class)->setMockClassName('FixedName')->getMock();
       
$this->assertInstanceOf(stdClass::class, $mock);
    }

    public function
testOriginalConstructorSettingConsidered()
    {
       
$mock1 = $this->getMockBuilder(PartialMockTestClass::class)
                      ->
getMock();

       
$mock2 = $this->getMockBuilder(PartialMockTestClass::class)
                      ->
disableOriginalConstructor()
                      ->
getMock();

       
$this->assertTrue($mock1->constructorCalled);
       
$this->assertFalse($mock2->constructorCalled);
    }

    public function
testOriginalCloneSettingConsidered()
    {
       
$mock1 = $this->getMockBuilder(PartialMockTestClass::class)
                      ->
getMock();

       
$mock2 = $this->getMockBuilder(PartialMockTestClass::class)
                      ->
disableOriginalClone()
                      ->
getMock();

       
$this->assertNotEquals(get_class($mock1), get_class($mock2));
    }

    public function
testGetMockForAbstractClass()
    {
       
$mock = $this->getMockBuilder(AbstractMockTestClass::class)
                     ->
getMock();

       
$mock->expects($this->never())
             ->
method('doSomething');
    }

   
/**
     * @dataProvider traversableProvider
     */
   
public function testGetMockForTraversable($type)
    {
       
$mock = $this->getMockBuilder($type)
                     ->
getMock();

       
$this->assertInstanceOf(Traversable::class, $mock);
    }

    public function
testMultipleInterfacesCanBeMockedInSingleObject()
    {
       
$mock = $this->getMockBuilder([AnInterface::class, AnotherInterface::class])
                     ->
getMock();

       
$this->assertInstanceOf(AnInterface::class, $mock);
       
$this->assertInstanceOf(AnotherInterface::class, $mock);
    }

    public function
testGetMockForTrait()
    {
       
$mock = $this->getMockForTrait(AbstractTrait::class);

       
$mock->expects($this->never())
             ->
method('doSomething');

       
$parent = get_parent_class($mock);
       
$traits = class_uses($parent, false);

       
$this->assertContains(AbstractTrait::class, $traits);
    }

    public function
testClonedMockObjectShouldStillEqualTheOriginal()
    {
       
$a = $this->getMockBuilder(stdClass::class)
                  ->
getMock();

       
$b = clone $a;

       
$this->assertEquals($a, $b);
    }

    public function
testMockObjectsConstructedIndepentantlyShouldBeEqual()
    {
       
$a = $this->getMockBuilder(stdClass::class)
                  ->
getMock();

       
$b = $this->getMockBuilder(stdClass::class)
                  ->
getMock();

       
$this->assertEquals($a, $b);
    }

    public function
testMockObjectsConstructedIndepentantlyShouldNotBeTheSame()
    {
       
$a = $this->getMockBuilder(stdClass::class)
                  ->
getMock();

       
$b = $this->getMockBuilder(stdClass::class)
                  ->
getMock();

       
$this->assertNotSame($a, $b);
    }

    public function
testClonedMockObjectCanBeUsedInPlaceOfOriginalOne()
    {
       
$x = $this->getMockBuilder(stdClass::class)
                  ->
getMock();

       
$y = clone $x;

       
$mock = $this->getMockBuilder(stdClass::class)
                     ->
setMethods(['foo'])
                     ->
getMock();

       
$mock->expects($this->once())
             ->
method('foo')
             ->
with($this->equalTo($x));

       
$mock->foo($y);
    }

    public function
testClonedMockObjectIsNotIdenticalToOriginalOne()
    {
       
$x = $this->getMockBuilder(stdClass::class)
                  ->
getMock();

       
$y = clone $x;

       
$mock = $this->getMockBuilder(stdClass::class)
                     ->
setMethods(['foo'])
                     ->
getMock();

       
$mock->expects($this->once())
             ->
method('foo')
             ->
with($this->logicalNot($this->identicalTo($x)));

       
$mock->foo($y);
    }

    public function
testObjectMethodCallWithArgumentCloningEnabled()
    {
       
$expectedObject = new stdClass;

       
$mock = $this->getMockBuilder('SomeClass')
                     ->
setMethods(['doSomethingElse'])
                     ->
enableArgumentCloning()
                     ->
getMock();

       
$actualArguments = [];

       
$mock->expects($this->any())
             ->
method('doSomethingElse')
             ->
will(
                 
$this->returnCallback(
                     function () use (&
$actualArguments) {
                         
$actualArguments = func_get_args();
                     }
                 )
             );

       
$mock->doSomethingElse($expectedObject);

       
$this->assertEquals(1, count($actualArguments));
       
$this->assertEquals($expectedObject, $actualArguments[0]);
       
$this->assertNotSame($expectedObject, $actualArguments[0]);
    }

    public function
testObjectMethodCallWithArgumentCloningDisabled()
    {
       
$expectedObject = new stdClass;

       
$mock = $this->getMockBuilder('SomeClass')
                     ->
setMethods(['doSomethingElse'])
                     ->
disableArgumentCloning()
                     ->
getMock();

       
$actualArguments = [];

       
$mock->expects($this->any())
             ->
method('doSomethingElse')
             ->
will(
                 
$this->returnCallback(
                     function () use (&
$actualArguments) {
                         
$actualArguments = func_get_args();
                     }
                 )
             );

       
$mock->doSomethingElse($expectedObject);

       
$this->assertEquals(1, count($actualArguments));
       
$this->assertSame($expectedObject, $actualArguments[0]);
    }

    public function
testArgumentCloningOptionGeneratesUniqueMock()
    {
       
$mockWithCloning = $this->getMockBuilder('SomeClass')
                                ->
setMethods(['doSomethingElse'])
                                ->
enableArgumentCloning()
                                ->
getMock();

       
$mockWithoutCloning = $this->getMockBuilder('SomeClass')
                                   ->
setMethods(['doSomethingElse'])
                                   ->
disableArgumentCloning()
                                   ->
getMock();

       
$this->assertNotEquals($mockWithCloning, $mockWithoutCloning);
    }

    public function
testVerificationOfMethodNameFailsWithoutParameters()
    {
       
$mock = $this->getMockBuilder(SomeClass::class)
                     ->
setMethods(['right', 'wrong'])
                     ->
getMock();

       
$mock->expects($this->once())
             ->
method('right');

       
$mock->wrong();

        try {
           
$mock->__phpunit_verify();
           
$this->fail('Expected exception');
        } catch (
ExpectationFailedException $e) {
           
$this->assertSame(
               
'Expectation failed for method name is equal to "right" when invoked 1 time(s).' . PHP_EOL .
               
'Method was expected to be called 1 times, actually called 0 times.' . PHP_EOL,
               
$e->getMessage()
            );
        }

       
$this->resetMockObjects();
    }

    public function
testVerificationOfMethodNameFailsWithParameters()
    {
       
$mock = $this->getMockBuilder(SomeClass::class)
                     ->
setMethods(['right', 'wrong'])
                     ->
getMock();

       
$mock->expects($this->once())
             ->
method('right');

       
$mock->wrong();

        try {
           
$mock->__phpunit_verify();
           
$this->fail('Expected exception');
        } catch (
ExpectationFailedException $e) {
           
$this->assertSame(
               
'Expectation failed for method name is equal to "right" when invoked 1 time(s).' . PHP_EOL .
               
'Method was expected to be called 1 times, actually called 0 times.' . PHP_EOL,
               
$e->getMessage()
            );
        }

       
$this->resetMockObjects();
    }

    public function
testVerificationOfMethodNameFailsWithWrongParameters()
    {
       
$mock = $this->getMockBuilder(SomeClass::class)
                     ->
setMethods(['right', 'wrong'])
                     ->
getMock();

       
$mock->expects($this->once())
             ->
method('right')
             ->
with(['first', 'second']);

        try {
           
$mock->right(['second']);
        } catch (
ExpectationFailedException $e) {
           
$this->assertSame(
               
'Expectation failed for method name is equal to "right" when invoked 1 time(s)' . PHP_EOL .
               
'Parameter 0 for invocation SomeClass::right(Array (...)) does not match expected value.' . PHP_EOL .
               
'Failed asserting that two arrays are equal.',
               
$e->getMessage()
            );
        }

        try {
           
$mock->__phpunit_verify();

// CHECKOUT THIS MORE CAREFULLY
//            $this->fail('Expected exception');

       
} catch (ExpectationFailedException $e) {
           
$this->assertSame(
               
'Expectation failed for method name is equal to "right" when invoked 1 time(s).' . PHP_EOL .
               
'Parameter 0 for invocation SomeClass::right(Array (...)) does not match expected value.' . PHP_EOL .
               
'Failed asserting that two arrays are equal.' . PHP_EOL .
               
'--- Expected' . PHP_EOL .
               
'+++ Actual' . PHP_EOL .
               
'@@ @@' . PHP_EOL .
               
' Array (' . PHP_EOL .
               
'-    0 => \'first\'' . PHP_EOL .
               
'-    1 => \'second\'' . PHP_EOL .
               
'+    0 => \'second\'' . PHP_EOL,
               
$e->getMessage()
            );
        }

       
$this->resetMockObjects();
    }

    public function
testVerificationOfNeverFailsWithEmptyParameters()
    {
       
$mock = $this->getMockBuilder(SomeClass::class)
                     ->
setMethods(['right', 'wrong'])
                     ->
getMock();

       
$mock->expects($this->never())
             ->
method('right')
             ->
with();

        try {
           
$mock->right();
           
$this->fail('Expected exception');
        } catch (
ExpectationFailedException $e) {
           
$this->assertSame(
               
'SomeClass::right() was not expected to be called.',
               
$e->getMessage()
            );
        }

       
$this->resetMockObjects();
    }

    public function
testVerificationOfNeverFailsWithAnyParameters()
    {
       
$mock = $this->getMockBuilder(SomeClass::class)
                     ->
setMethods(['right', 'wrong'])
                     ->
getMock();

       
$mock->expects($this->never())
             ->
method('right')
             ->
withAnyParameters();

        try {
           
$mock->right();
           
$this->fail('Expected exception');
        } catch (
ExpectationFailedException $e) {
           
$this->assertSame(
               
'SomeClass::right() was not expected to be called.',
               
$e->getMessage()
            );
        }

       
$this->resetMockObjects();
    }

    public function
testWithAnythingInsteadOfWithAnyParameters()
    {
       
$mock = $this->getMockBuilder(SomeClass::class)
                     ->
setMethods(['right', 'wrong'])
                     ->
getMock();

       
$mock->expects($this->once())
             ->
method('right')
             ->
with($this->anything());

        try {
           
$mock->right();
           
$this->fail('Expected exception');
        } catch (
ExpectationFailedException $e) {
           
$this->assertSame(
               
'Expectation failed for method name is equal to "right" when invoked 1 time(s)' . PHP_EOL .
               
'Parameter count for invocation SomeClass::right() is too low.' . PHP_EOL .
               
'To allow 0 or more parameters with any value, omit ->with() or use ->withAnyParameters() instead.',
               
$e->getMessage()
            );
        }

       
$this->resetMockObjects();
    }

   
/**
     * See https://github.com/sebastianbergmann/phpunit-mock-objects/issues/81
     */
   
public function testMockArgumentsPassedByReference()
    {
       
$foo = $this->getMockBuilder('MethodCallbackByReference')
                    ->
setMethods(['bar'])
                    ->
disableOriginalConstructor()
                    ->
disableArgumentCloning()
                    ->
getMock();

       
$foo->expects($this->any())
            ->
method('bar')
            ->
will($this->returnCallback([$foo, 'callback']));

       
$a = $b = $c = 0;

       
$foo->bar($a, $b, $c);

       
$this->assertEquals(1, $b);
    }

   
/**
     * See https://github.com/sebastianbergmann/phpunit-mock-objects/issues/81
     */
   
public function testMockArgumentsPassedByReference2()
    {
       
$foo = $this->getMockBuilder('MethodCallbackByReference')
                    ->
disableOriginalConstructor()
                    ->
disableArgumentCloning()
                    ->
getMock();

       
$foo->expects($this->any())
            ->
method('bar')
            ->
will($this->returnCallback(
                function (&
$a, &$b, $c) {
                   
$b = 1;
                }
            ));

       
$a = $b = $c = 0;

       
$foo->bar($a, $b, $c);

       
$this->assertEquals(1, $b);
    }

   
/**
     * @see https://github.com/sebastianbergmann/phpunit-mock-objects/issues/116
     */
   
public function testMockArgumentsPassedByReference3()
    {
       
$foo = $this->getMockBuilder('MethodCallbackByReference')
                    ->
setMethods(['bar'])
                    ->
disableOriginalConstructor()
                    ->
disableArgumentCloning()
                    ->
getMock();

       
$a = new stdClass;
       
$b = $c = 0;

       
$foo->expects($this->any())
            ->
method('bar')
            ->
with($a, $b, $c)
            ->
will($this->returnCallback([$foo, 'callback']));

       
$this->assertNull($foo->bar($a, $b, $c));
    }

   
/**
     * @see https://github.com/sebastianbergmann/phpunit/issues/796
     */
   
public function testMockArgumentsPassedByReference4()
    {
       
$foo = $this->getMockBuilder('MethodCallbackByReference')
                    ->
setMethods(['bar'])
                    ->
disableOriginalConstructor()
                    ->
disableArgumentCloning()
                    ->
getMock();

       
$a = new stdClass;
       
$b = $c = 0;

       
$foo->expects($this->any())
            ->
method('bar')
            ->
with($this->isInstanceOf(stdClass::class), $b, $c)
            ->
will($this->returnCallback([$foo, 'callback']));

       
$this->assertNull($foo->bar($a, $b, $c));
    }

   
/**
     * @requires extension soap
     */
   
public function testCreateMockFromWsdl()
    {
       
$mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl', 'WsdlMock');

       
$this->assertStringStartsWith(
           
'Mock_WsdlMock_',
           
get_class($mock)
        );
    }

   
/**
     * @requires extension soap
     */
   
public function testCreateNamespacedMockFromWsdl()
    {
       
$mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl', 'My\\Space\\WsdlMock');

       
$this->assertStringStartsWith(
           
'Mock_WsdlMock_',
           
get_class($mock)
        );
    }

   
/**
     * @requires extension soap
     */
   
public function testCreateTwoMocksOfOneWsdlFile()
    {
       
$a = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl');
       
$b = $this->getMockFromWsdl(__DIR__ . '/_fixture/GoogleSearch.wsdl');

       
$this->assertStringStartsWith('Mock_GoogleSearch_', get_class($a));
       
$this->assertEquals(get_class($a), get_class($b));
    }

   
/**
     * @requires extension soap
     */
   
public function testCreateMockOfWsdlFileWithSpecialChars()
    {
       
$mock = $this->getMockFromWsdl(__DIR__ . '/_fixture/Go ogle-Sea.rch.wsdl');

       
$this->assertStringStartsWith('Mock_GoogleSearch_', get_class($mock));
    }

   
/**
     * @see    https://github.com/sebastianbergmann/phpunit-mock-objects/issues/156
     * @ticket 156
     */
   
public function testInterfaceWithStaticMethodCanBeStubbed()
    {
       
$this->assertInstanceOf(
           
InterfaceWithStaticMethod::class,
           
$this->getMockBuilder(InterfaceWithStaticMethod::class)->getMock()
        );
    }

    public function
testInvokingStubbedStaticMethodRaisesException()
    {
       
$mock = $this->getMockBuilder(ClassWithStaticMethod::class)->getMock();

       
$this->expectException(\PHPUnit\Framework\MockObject\BadMethodCallException::class);

       
$mock->staticMethod();
    }

   
/**
     * @see    https://github.com/sebastianbergmann/phpunit-mock-objects/issues/171
     * @ticket 171
     */
   
public function testStubForClassThatImplementsSerializableCanBeCreatedWithoutInvokingTheConstructor()
    {
       
$this->assertInstanceOf(
           
ClassThatImplementsSerializable::class,
           
$this->getMockBuilder(ClassThatImplementsSerializable::class)
                 ->
disableOriginalConstructor()
                 ->
getMock()
        );
    }

    public function
testGetMockForClassWithSelfTypeHint()
    {
       
$this->assertInstanceOf(
           
ClassWithSelfTypeHint::class,
           
$this->getMockBuilder(ClassWithSelfTypeHint::class)->getMock()
        );
    }

    private function
resetMockObjects()
    {
       
$refl = new ReflectionObject($this);
       
$refl = $refl->getParentClass();
       
$prop = $refl->getProperty('mockObjects');
       
$prop->setAccessible(true);
       
$prop->setValue($this, []);
    }

    public function
testStringableClassDoesNotThrow()
    {
       
$mock = $this->getMockBuilder(StringableClass::class)->getMock();

       
$this->assertInternalType('string', (string) $mock);
    }

    public function
testStringableClassCanBeMocked()
    {
       
$mock = $this->getMockBuilder(StringableClass::class)->getMock();

       
$mock->method('__toString')->willReturn('foo');

       
$this->assertSame('foo', (string) $mock);
    }

    public function
traversableProvider()
    {
        return [
          [
'Traversable'],
          [
'\Traversable'],
          [
'TraversableMockTestInterface'],
          [[
'Traversable']],
          [[
'Iterator','Traversable']],
          [[
'\Iterator','\Traversable']]
        ];
    }

    public function
testParameterCallbackConstraintOnlyEvaluatedOnce()
    {
       
$mock                  = $this->getMockBuilder(Foo::class)->setMethods(['bar'])->getMock();
       
$expectedNumberOfCalls = 1;
       
$callCount             = 0;

       
$mock->expects($this->exactly($expectedNumberOfCalls))->method('bar')
            ->
with($this->callback(function ($argument) use (&$callCount) {
                return
$argument === 'call_' . $callCount++;
            }));

        for (
$i = 0; $i < $expectedNumberOfCalls; $i++) {
           
$mock->bar('call_' . $i);
        }
    }

    public function
testReturnTypesAreMockedCorrectly()
    {
       
/** @var ClassWithAllPossibleReturnTypes|MockObject $stub */
       
$stub = $this->createMock(ClassWithAllPossibleReturnTypes::class);

       
$this->assertNull($stub->methodWithNoReturnTypeDeclaration());
       
$this->assertSame('', $stub->methodWithStringReturnTypeDeclaration());
       
$this->assertSame(0.0, $stub->methodWithFloatReturnTypeDeclaration());
       
$this->assertSame(0, $stub->methodWithIntReturnTypeDeclaration());
       
$this->assertFalse($stub->methodWithBoolReturnTypeDeclaration());
       
$this->assertSame([], $stub->methodWithArrayReturnTypeDeclaration());
       
$this->assertInstanceOf(MockObject::class, $stub->methodWithClassReturnTypeDeclaration());
    }

   
/**
     * @requires PHP 7.1
     */
   
public function testVoidReturnTypeIsMockedCorrectly()
    {
       
/** @var ClassWithAllPossibleReturnTypes|MockObject $stub */
       
$stub = $this->createMock(ClassWithAllPossibleReturnTypes::class);

       
$this->assertNull($stub->methodWithVoidReturnTypeDeclaration());
    }

   
/**
     * @requires PHP 7.2
     */
   
public function testObjectReturnTypeIsMockedCorrectly()
    {
       
/** @var ClassWithAllPossibleReturnTypes|MockObject $stub */
       
$stub = $this->createMock(ClassWithAllPossibleReturnTypes::class);

       
$this->assertInstanceOf(stdClass::class, $stub->methodWithObjectReturnTypeDeclaration());
    }
}