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