packages/sql-catalog/tests/Unit/Reporter/Html/ScopeTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Reporter\Html;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\DataProvider;
9use PHPUnit\Framework\TestCase;
10use SqlCatalog\Reporter\Html\Scope;
11
12#[CoversClass(Scope::class)]
13final class ScopeTest extends TestCase
14{
15    /**
16     * @return list<array{string, string, string|null, string}>
17     */
18    public static function providerOf(): array
19    {
20        return [
21            ['App\\Repo\\Users::find', 'App\\Repo', 'App\\Repo\\Users', 'find'],
22            ['\\App\\Repo\\Users::find', 'App\\Repo', 'App\\Repo\\Users', 'find'],
23            ['Users::find', '', 'Users', 'find'],
24            ['App\\helper', 'App', null, 'helper'],
25            ['wp_insert_post', '', null, 'wp_insert_post'],
26            ['{main}', '', null, '{main}'],
27        ];
28    }
29
30    #[DataProvider('providerOf')]
31    public function testOfReadsTheNamespaceClassAndMember(string $function, string $namespace, ?string $class, string $member): void
32    {
33        $scope = Scope::of($function);
34
35        self::assertSame([$namespace, $class, $member], [$scope->namespace, $scope->class, $scope->member]);
36    }
37
38    public function testIsMainOnlyForTopLevelCode(): void
39    {
40        self::assertTrue(Scope::of('{main}')->isMain());
41        self::assertFalse(Scope::of('f')->isMain());
42    }
43
44    public function testIsMethodWhenThereIsAClass(): void
45    {
46        self::assertTrue(Scope::of('A::b')->isMethod());
47        self::assertFalse(Scope::of('b')->isMethod());
48    }
49
50    public function testClassShortDropsTheNamespace(): void
51    {
52        self::assertSame('Users', Scope::of('App\\Users::find')->classShort());
53        self::assertSame('Users', Scope::of('Users::find')->classShort());
54        self::assertNull(Scope::of('find')->classShort());
55    }
56
57    public function testFunctionWritesTheNameTheCatalogUses(): void
58    {
59        self::assertSame('App\\Users::find', Scope::of('\\App\\Users::find')->function());
60        self::assertSame('App\\helper', Scope::of('App\\helper')->function());
61        self::assertSame('helper', Scope::of('helper')->function());
62    }
63
64    public function testDisplayDropsTheNamespaceAndNamesTopLevelCode(): void
65    {
66        self::assertSame('Users::find', Scope::of('App\\Users::find')->display());
67        self::assertSame('helper', Scope::of('App\\helper')->display());
68        self::assertSame('top-level code', Scope::of('{main}')->display());
69    }
70
71    public function testNamespaceLabelNamesTheGlobalNamespace(): void
72    {
73        self::assertSame('(global namespace)', Scope::of('f')->namespaceLabel());
74        self::assertSame('App', Scope::of('App\\f')->namespaceLabel());
75    }
76}
77