Passed
Push — main ( 06ee14...a96829 )
by Chema
03:58
created

exampleOneLevelComposerJson()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 10
nc 1
nop 0
dl 0
loc 12
rs 9.9332
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace GacelaTest\Unit\Console\Domain\CommandArguments;
6
7
use Gacela\Console\Domain\CommandArguments\CommandArgumentsException;
8
use Gacela\Console\Domain\CommandArguments\CommandArgumentsParser;
9
use PHPUnit\Framework\TestCase;
10
11
final class CommandArgumentsParserTest extends TestCase
12
{
13
    public function test_exception_when_no_autoload_found(): void
14
    {
15
        $this->expectExceptionObject(CommandArgumentsException::noAutoloadFound());
16
        $parser = new CommandArgumentsParser([]);
17
        $parser->parse('');
18
    }
19
20
    public function test_exception_when_no_psr4_found(): void
21
    {
22
        $this->expectExceptionObject(CommandArgumentsException::noAutoloadPsr4Found());
23
        $parser = new CommandArgumentsParser(['autoload' => []]);
24
        $parser->parse('');
25
    }
26
27
    public function test_parse_one_level_from_root_namespace(): void
28
    {
29
        $parser = new CommandArgumentsParser($this->exampleOneLevelComposerJson());
30
        $args = $parser->parse('App/TestModule');
31
32
        self::assertSame('App\TestModule', $args->namespace());
33
    }
34
35
    public function test_parse_multi_level_from_root_namespace(): void
36
    {
37
        $parser = new CommandArgumentsParser($this->exampleOneLevelComposerJson());
38
        $args = $parser->parse('App/TestModule/TestSubModule');
39
40
        self::assertSame('App\TestModule\TestSubModule', $args->namespace());
41
    }
42
43
    public function test_parse_one_level_from_target_directory(): void
44
    {
45
        $parser = new CommandArgumentsParser($this->exampleOneLevelComposerJson());
46
        $args = $parser->parse('App/TestModule');
47
48
        self::assertSame('src/TestModule', $args->directory());
49
    }
50
51
    public function test_parse_multi_level_from_target_directory(): void
52
    {
53
        $parser = new CommandArgumentsParser($this->exampleOneLevelComposerJson());
54
        $args = $parser->parse('App/TestModule/TestSubModule');
55
56
        self::assertSame('src/TestModule/TestSubModule', $args->directory());
57
    }
58
59
    public function test_parse_multilevel_root_namespace(): void
60
    {
61
        $parser = new CommandArgumentsParser($this->exampleMultiLevelComposerJson());
62
        $args = $parser->parse('App/TestModule/TestSubModule');
63
64
        self::assertSame('App\TestModule\TestSubModule', $args->namespace());
65
    }
66
67
    public function test_parse_multilevel_target_directory(): void
68
    {
69
        $parser = new CommandArgumentsParser($this->exampleMultiLevelComposerJson());
70
        $args = $parser->parse('App/TestModule/TestSubModule');
71
72
        self::assertSame('src/TestSubModule', $args->directory());
73
    }
74
75
    public function test_no_autoload_psr4_match_found(): void
76
    {
77
        $this->expectExceptionObject(
78
            CommandArgumentsException::noAutoloadPsr4MatchFound('Unknown/Module', ['App']),
79
        );
80
81
        $parser = new CommandArgumentsParser($this->exampleOneLevelComposerJson());
82
        $parser->parse('Unknown/Module');
83
    }
84
85
    public function test_parse_with_multibyte_namespace(): void
86
    {
87
        $parser = new CommandArgumentsParser($this->exampleMultibyteComposerJson());
88
        $args = $parser->parse('Tëst/Mödülé');
89
90
        self::assertSame('Tëst\Mödülé', $args->namespace());
91
        self::assertSame('src/Mödülé', $args->directory());
92
    }
93
94
    private function exampleOneLevelComposerJson(): array
95
    {
96
        $composerJson = <<<'JSON'
97
{
98
    "autoload": {
99
        "psr-4": {
100
            "App\\": "src/"
101
        }
102
    }
103
}
104
JSON;
105
        return json_decode($composerJson, true);
106
    }
107
108
    /**
109
     * @return array{autoload: array{psr-4: array<string,string>}}
110
     */
111
    private function exampleMultiLevelComposerJson(): array
112
    {
113
        $composerJson = <<<'JSON'
114
{
115
    "autoload": {
116
        "psr-4": {
117
            "App\\TestModule\\": "src/"
118
        }
119
    }
120
}
121
JSON;
122
        return json_decode($composerJson, true);
123
    }
124
125
    /**
126
     * @return array{autoload: array{psr-4: array<string,string>}}
127
     */
128
    private function exampleMultibyteComposerJson(): array
129
    {
130
        $composerJson = <<<'JSON'
131
{
132
    "autoload": {
133
        "psr-4": {
134
            "Tëst\\": "src/"
135
        }
136
    }
137
}
138
JSON;
139
        return json_decode($composerJson, true);
140
    }
141
}
142