1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
<?php
namespace Mockery\Tests\PHP80;
use ArrayIterator;
use DateTime;
use Iterator;
use IteratorAggregate;
use Mockery\Adapter\Phpunit\MockeryTestCase;
use ReturnTypeWillChange;
/**
* @requires PHP 8.0.0-dev
*/
class Php80LanguageFeaturesTest extends MockeryTestCase
{
public function testMockingIteratorAggregateDoesNotImplementIterator()
{
$mock = mock(ImplementsIteratorAggregate::class);
$this->assertInstanceOf('IteratorAggregate', $mock);
$this->assertInstanceOf('Traversable', $mock);
$this->assertNotInstanceOf('Iterator', $mock);
}
public function testMockingIteratorDoesNotImplementIterator()
{
$mock = mock(ImplementsIterator::class);
$this->assertInstanceOf('Iterator', $mock);
$this->assertInstanceOf('Traversable', $mock);
}
/** @test */
public function it_can_mock_a_class_with_a_mixed_argument_type_hint()
{
$mock = mock(ArgumentMixedTypeHint::class);
$object = new \stdClass();
$mock->allows()->foo($object)->once();
$mock->foo($object);
}
/** @test */
public function it_can_mock_a_class_with_a_union_argument_type_hint()
{
$mock = mock(ArgumentUnionTypeHint::class);
$object = new ArgumentUnionTypeHint();
$mock->allows()->foo($object)->once();
$mock->foo($object);
}
/** @test */
public function it_can_mock_a_class_with_a_union_argument_type_hint_including_null()
{
$mock = mock(ArgumentUnionTypeHintWithNull::class);
$mock->allows()->foo(null)->once();
$mock->foo(null);
}
/** @test */
public function it_can_mock_a_class_with_a_parent_argument_type_hint()
{
$mock = mock(ArgumentParentTypeHint::class);
$object = new ArgumentParentTypeHint();
$mock->allows()->foo($object)->once();
$mock->foo($object);
}
/** @test */
public function it_can_mock_a_class_with_a_mixed_return_type_hint()
{
$mock = spy(ReturnTypeMixedTypeHint::class);
$this->assertNull($mock->foo());
}
/** @test */
public function it_can_mock_a_class_with_a_union_return_type_hint()
{
$mock = spy(ReturnTypeUnionTypeHint::class);
$this->assertTrue(is_object($mock->foo()));
}
/** @test */
public function it_can_mock_a_class_with_a_parent_return_type_hint()
{
$mock = spy(ReturnTypeParentTypeHint::class);
$this->assertInstanceOf(\stdClass::class, $mock->foo());
}
}
class ImplementsIteratorAggregate implements IteratorAggregate
{
public function getIterator(): ArrayIterator
{
return new ArrayIterator([]);
}
}
class ImplementsIterator implements Iterator
{
public function rewind(): void
{
}
public function current(): mixed
{
}
public function key(): mixed
{
}
public function next(): void
{
}
public function valid(): bool
{
}
}
class ArgumentMixedTypeHint
{
public function foo(mixed $foo)
{
}
}
class ArgumentUnionTypeHint
{
public function foo(string|array|self $foo)
{
}
}
class ArgumentUnionTypeHintWithNull
{
public function foo(string|array|null $foo)
{
}
}
class ArgumentParentTypeHint extends \stdClass
{
public function foo(parent $foo)
{
}
}
class ReturnTypeMixedTypeHint
{
public function foo(): mixed
{
}
}
class ReturnTypeUnionTypeHint
{
public function foo(): ReturnTypeMixedTypeHint|self
{
}
}
class ReturnTypeParentTypeHint extends \stdClass
{
public function foo(): parent
{
}
}
|