Skip to content

Commit 3db07fa

Browse files
committed
Refactor tests
1 parent 730a9b5 commit 3db07fa

File tree

4 files changed

+138
-90
lines changed

4 files changed

+138
-90
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Typhoon\Reflection;
6+
7+
use PHPUnit\Framework\Attributes\CoversClass;
8+
use PHPUnit\Framework\Attributes\DataProvider;
9+
use PHPUnit\Framework\TestCase;
10+
use Symfony\Component\Finder\Finder;
11+
12+
#[CoversClass(TyphoonReflector::class)]
13+
#[CoversClass(AliasReflection::class)]
14+
#[CoversClass(AttributeReflection::class)]
15+
#[CoversClass(ClassConstantReflection::class)]
16+
#[CoversClass(ClassReflection::class)]
17+
#[CoversClass(ConstantReflection::class)]
18+
#[CoversClass(FunctionReflection::class)]
19+
#[CoversClass(MethodReflection::class)]
20+
#[CoversClass(ParameterReflection::class)]
21+
#[CoversClass(PropertyReflection::class)]
22+
#[CoversClass(TemplateReflection::class)]
23+
#[CoversClass(Location::class)]
24+
final class FunctionalTest extends TestCase
25+
{
26+
private static ?TyphoonReflector $reflector = null;
27+
28+
/**
29+
* @return \Generator<string, array{string}>
30+
*/
31+
public static function files(): \Generator
32+
{
33+
foreach (Finder::create()->in(__DIR__ . '/functional_tests')->name('*.php') as $file) {
34+
yield substr($file->getRelativePathname(), 0, -4) => [$file->getPathname()];
35+
}
36+
}
37+
38+
#[DataProvider('files')]
39+
public function test(string $file): void
40+
{
41+
self::$reflector ??= TyphoonReflector::build();
42+
/** @psalm-suppress UnresolvableInclude */
43+
$test = require_once $file;
44+
\assert($test instanceof \Closure);
45+
46+
$test(self::$reflector, $this);
47+
}
48+
}

tests/Reflection/Internal/NativeAdapter/AdapterCompatibilityTest.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
use Traits\Trait1;
1212
use Typhoon\DeclarationId\Id;
1313
use Typhoon\PhpStormReflectionStubs\PhpStormStubsLocator;
14-
use Typhoon\Reflection\Internal\NativeReflector\NativeReflector;
1514
use Typhoon\Reflection\TyphoonReflector;
1615
use Typhoon\Type\Variance;
1716

@@ -29,7 +28,6 @@
2928
#[CoversClass(NamedTypeAdapter::class)]
3029
#[CoversClass(UnionTypeAdapter::class)]
3130
#[CoversClass(IntersectionTypeAdapter::class)]
32-
#[CoversClass(NativeReflector::class)]
3331
final class AdapterCompatibilityTest extends TestCase
3432
{
3533
private static TyphoonReflector $defaultReflector;
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Typhoon\Reflection\Internal\NativeReflector;
6+
7+
use PHPUnit\Framework\Attributes\CoversClass;
8+
use PHPUnit\Framework\Attributes\DataProvider;
9+
use PHPUnit\Framework\TestCase;
10+
use Typhoon\ChangeDetector\ConstantChangeDetector;
11+
use Typhoon\DeclarationId\ConstantId;
12+
use Typhoon\DeclarationId\Id;
13+
use Typhoon\Reflection\Internal\Data;
14+
use Typhoon\Reflection\Internal\Data\TypeData;
15+
use Typhoon\Type\types;
16+
use function Typhoon\Reflection\Internal\get_namespace;
17+
18+
#[CoversClass(DefinedConstantReflector::class)]
19+
final class DefinedConstantReflectorTest extends TestCase
20+
{
21+
public function testItReturnsNullForUndefinedConstant(): void
22+
{
23+
$reflector = new DefinedConstantReflector();
24+
25+
$data = $reflector->reflectConstant(Id::constant(self::class));
26+
27+
self::assertNull($data);
28+
}
29+
30+
/**
31+
* @return \Generator<non-empty-string, array{non-empty-string, ?non-empty-string, mixed}>
32+
*/
33+
public static function definedConstantsWithoutNAN(): \Generator
34+
{
35+
foreach (get_defined_constants(categorize: true) as $category => $constants) {
36+
foreach ($constants as $name => $value) {
37+
if ($name === 'NAN') {
38+
continue;
39+
}
40+
41+
$extension = $category === 'user' ? null : (new \ReflectionExtension($category))->name;
42+
43+
\assert($name !== '');
44+
\assert($extension !== '');
45+
46+
yield $name => [Id::constant($name), $extension, $value];
47+
48+
return ;
49+
}
50+
}
51+
}
52+
53+
#[DataProvider('definedConstantsWithoutNAN')]
54+
public function testDefinedConstantsWithoutNAN(ConstantId $id, ?string $extension, mixed $value): void
55+
{
56+
$reflector = new DefinedConstantReflector();
57+
58+
$data = $reflector->reflectConstant($id);
59+
60+
self::assertNotNull($data);
61+
self::assertSame($value, $data[Data::ValueExpression]->evaluate());
62+
self::assertEquals(new TypeData(inferred: types::value($value)), $data[Data::Type]);
63+
self::assertSame($extension, $data[Data::PhpExtension]);
64+
self::assertSame($extension !== null, $data[Data::InternallyDefined]);
65+
self::assertNull($data[Data::PhpDoc]);
66+
self::assertNull($data[Data::Location]);
67+
self::assertNull($data[Data::Deprecation]);
68+
self::assertSame(get_namespace($id->name), $data[Data::Namespace]);
69+
self::assertEquals(ConstantChangeDetector::fromName($id->name), $data[Data::ChangeDetector]);
70+
}
71+
72+
public function testNAN(): void
73+
{
74+
$id = Id::constant('NAN');
75+
$reflector = new DefinedConstantReflector();
76+
77+
$data = $reflector->reflectConstant($id);
78+
79+
self::assertNotNull($data);
80+
self::assertNan($data[Data::ValueExpression]->evaluate());
81+
self::assertEquals(new TypeData(inferred: types::constant('NAN')), $data[Data::Type]);
82+
self::assertSame('standard', $data[Data::PhpExtension]);
83+
self::assertTrue($data[Data::InternallyDefined]);
84+
self::assertNull($data[Data::PhpDoc]);
85+
self::assertNull($data[Data::Location]);
86+
self::assertNull($data[Data::Deprecation]);
87+
self::assertSame('', $data[Data::Namespace]);
88+
self::assertInstanceOf(ConstantChangeDetector::class, $data[Data::ChangeDetector]);
89+
}
90+
}

tests/Reflection/TyphoonReflectorFunctionalTest.php

Lines changed: 0 additions & 88 deletions
This file was deleted.

0 commit comments

Comments
 (0)