Skip to content

Commit

Permalink
Test PHP 8.3 language features (#1299)
Browse files Browse the repository at this point in the history
Signed-off-by: Nathanael Esayeas <nathanael.esayeas@protonmail.com>
  • Loading branch information
ghostwriter committed Jul 24, 2023
2 parents d141375 + 03da3dd commit f14c1b1
Show file tree
Hide file tree
Showing 10 changed files with 125 additions and 8 deletions.
1 change: 1 addition & 0 deletions composer.json
Expand Up @@ -69,6 +69,7 @@
"autoload-dev": {
"psr-4": {
"Fixture\\": "tests/Fixture/",
"Mockery\\Tests\\Unit\\": "tests/Unit",
"test\\": "tests/"
},
"files": [
Expand Down
12 changes: 6 additions & 6 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions phpunit.xml.dist
Expand Up @@ -33,18 +33,27 @@
<exclude>./tests/PHP80</exclude>
<exclude>./tests/PHP81</exclude>
<exclude>./tests/PHP82</exclude>
<exclude>./tests/Unit/PHP81</exclude>
<exclude>./tests/Unit/PHP83</exclude>
</testsuite>
<testsuite name="Mockery Test Suite PHP80">
<directory phpVersion="8.0.0-dev" phpVersionOperator="&gt;=">./tests</directory>
<exclude>./tests/PHP81</exclude>
<exclude>./tests/PHP82</exclude>
<exclude>./tests/Unit/PHP81</exclude>
<exclude>./tests/Unit/PHP83</exclude>
</testsuite>
<testsuite name="Mockery Test Suite PHP81">
<directory phpVersion="8.1.0-dev" phpVersionOperator="&gt;=">./tests</directory>
<exclude>./tests/PHP82</exclude>
<exclude>./tests/Unit/PHP83</exclude>
</testsuite>
<testsuite name="Mockery Test Suite PHP82">
<directory phpVersion="8.2.0-dev" phpVersionOperator="&gt;=">./tests</directory>
<exclude>./tests/Unit/PHP83</exclude>
</testsuite>
<testsuite name="Mockery Test Suite PHP83">
<directory phpVersion="8.3.0-dev" phpVersionOperator="&gt;=">./tests</directory>
</testsuite>
</testsuites>
</phpunit>
7 changes: 7 additions & 0 deletions tests/Fixture/PHP83/ClassName.php
@@ -0,0 +1,7 @@
<?php

namespace Fixture\PHP83;

class ClassName {
public const CONSTANT = 42;
}
7 changes: 7 additions & 0 deletions tests/Fixture/PHP83/Classes.php
@@ -0,0 +1,7 @@
<?php

namespace Fixture\PHP83;

class Classes implements Interfaces {
use Traits;
}
7 changes: 7 additions & 0 deletions tests/Fixture/PHP83/Enums.php
@@ -0,0 +1,7 @@
<?php

namespace Fixture\PHP83;

enum Enums {
const string FOO = "bar";
}
9 changes: 9 additions & 0 deletions tests/Fixture/PHP83/Interfaces.php
@@ -0,0 +1,9 @@
<?php

namespace Fixture\PHP83;

interface Interfaces {
const string BAR = Enums::FOO;

public function foo(): string;
}
12 changes: 12 additions & 0 deletions tests/Fixture/PHP83/Traits.php
@@ -0,0 +1,12 @@
<?php

namespace Fixture\PHP83;

trait Traits {
const string BAR = Enums::FOO;

public function foo(): string
{
return Interfaces::BAR;
}
}
4 changes: 2 additions & 2 deletions tests/Mockery/RegExpCompatability.php
Expand Up @@ -6,7 +6,7 @@ trait RegExpCompatability
{
public function expectExceptionMessageRegEx($regularExpression)
{
if (method_exists(get_parent_class(), 'expectExceptionMessageRegExp')) {
if (method_exists(get_parent_class($this), 'expectExceptionMessageRegExp')) {
return parent::expectExceptionMessageRegExp($regularExpression);
}

Expand All @@ -15,7 +15,7 @@ public function expectExceptionMessageRegEx($regularExpression)

public static function assertMatchesRegEx($pattern, $string, $message = '')
{
if (method_exists(get_parent_class(), 'assertMatchesRegularExpression')) {
if (method_exists(get_parent_class(static::class), 'assertMatchesRegularExpression')) {
return parent::assertMatchesRegularExpression($pattern, $string, $message);
}

Expand Down
65 changes: 65 additions & 0 deletions tests/Unit/PHP83/Php83LanguageFeaturesTest.php
@@ -0,0 +1,65 @@
<?php

declare(strict_types=1);

namespace Mockery\Tests\Unit\PHP83;

use Fixture\PHP83\Classes;
use Fixture\PHP83\ClassName;
use Fixture\PHP83\Enums;
use Fixture\PHP83\Interfaces;
use Fixture\PHP83\Traits;
use Mockery\Adapter\Phpunit\MockeryTestCase;
use Mockery\Exception;

/**
* @requires PHP 8.3.0-dev
*/
class Php83LanguageFeaturesTest extends MockeryTestCase
{
public function testCanMockClassTypedClassConstants(): void
{
$mock = mock(Classes::class);

self::assertInstanceOf(Classes::class, $mock);
self::assertSame(Enums::FOO, $mock::BAR);
}

public function testCanMockInterfaceTypedClassConstants(): void
{
$mock = mock(Interfaces::class);

self::assertInstanceOf(Interfaces::class, $mock);
self::assertSame(Enums::FOO, $mock::BAR);
}

public function testCanMockTraitTypedClassConstants(): void
{
$mock = mock(Traits::class);

self::assertSame(Enums::FOO, $mock->foo());
self::assertSame(Enums::FOO, $mock::BAR);
}

public function testCanMockWithDynamicClassConstantFetch(): void
{
$mock = mock(ClassName::class);

$constant = 'CONSTANT';

self::assertSame(ClassName::CONSTANT, $mock::CONSTANT);
self::assertSame(ClassName::CONSTANT, $mock::{$constant});
self::assertSame(ClassName::{$constant}, $mock::CONSTANT);
self::assertSame(ClassName::{$constant}, $mock::{$constant});
}

/**
* Enumerations ( enum ) are final classes and therefore cannot be mocked.
*/
public function testCanNotMockEnumsFinalClasses(): void
{
$this->expectException(Exception::class);

mock(Enums::class);
}
}

0 comments on commit f14c1b1

Please sign in to comment.