Skip to content

Commit cd288a6

Browse files
committed
Test enum generation
1 parent f8bfab1 commit cd288a6

File tree

8 files changed

+195
-1
lines changed

8 files changed

+195
-1
lines changed

tests/Feature/EnumMakeTest.php

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
use Cerbero\Enum\Enums;
4+
5+
it('fails if the enum name is not provided', function() {
6+
expect(runEnum('make'))
7+
->output->toContain('The name of the enum is missing.')
8+
->status->toBe(1);
9+
});
10+
11+
it('succeeds if an enum already exists', function() {
12+
expect(runEnum('make App/Enums/Enum1'))
13+
->output->toContain('The enum App\Enums\Enum1 already exists.')
14+
->status->toBe(0);
15+
});
16+
17+
it('fails if the enum cases are not provided', function() {
18+
expect(runEnum('make App/Enums/Test'))
19+
->output->toContain('The cases of the enum are missing.')
20+
->status->toBe(1);
21+
});
22+
23+
it('fails if the backed option is not supported', function() {
24+
expect(runEnum('make App/Enums/Test one --backed=test'))
25+
->output->toContain('The option --backed supports only')
26+
->status->toBe(1);
27+
});
28+
29+
it('generates annotated enums', function(string $enum, string $backed) {
30+
Enums::setBasePath(__DIR__ . '/../Skeleton');
31+
Enums::setPaths('app/Enums', 'domain/*/Enums');
32+
33+
expect(fn() => runEnum("make \"{$enum}\" CaseOne CaseTwo --backed={$backed}"))->toGenerate($enum);
34+
35+
(fn() => self::$paths = [])->bindTo(null, Enums::class)();
36+
(fn() => self::$basePath = null)->bindTo(null, Enums::class)();
37+
})->with([
38+
['App\Enums\Generated1', 'bitwise'],
39+
['Domain\Common\Enums\Generated2', 'snake'],
40+
]);
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
use Cerbero\Enum\Enums;
4+
use Cerbero\Enum\Services\Generator;
5+
6+
it('returns true if an enum already exists', function() {
7+
$outcome = (new Generator('App\Enums\Enum1', []))->generate();
8+
9+
expect($outcome)->toBeTrue();
10+
});
11+
12+
it('generates annotated enums', function(string $enum, ?string $backed) {
13+
Enums::setBasePath(__DIR__ . '/../Skeleton');
14+
Enums::setPaths('app/Enums', 'domain/*/Enums');
15+
16+
expect(fn() => (new Generator($enum, ['CaseOne', 'CaseTwo'], $backed))->generate())->toGenerate($enum);
17+
18+
(fn() => self::$paths = [])->bindTo(null, Enums::class)();
19+
(fn() => self::$basePath = null)->bindTo(null, Enums::class)();
20+
})->with([
21+
['App\Enums\Generated1', 'bitwise'],
22+
['Domain\Common\Enums\Generated2', 'snake'],
23+
]);
24+
25+
it('creates sub-directories if needed', function() {
26+
Enums::setBasePath(__DIR__ . '/../Skeleton');
27+
Enums::setPaths('app/Enums', 'domain/*/Enums');
28+
29+
$enum = 'SubDirectory\Generated3';
30+
31+
try {
32+
expect(fn() => (new Generator($enum, ['CaseOne', 'CaseTwo']))->generate())->toGenerate($enum);
33+
} finally {
34+
rmdir(Enums::basePath('SubDirectory'));
35+
}
36+
37+
(fn() => self::$paths = [])->bindTo(null, Enums::class)();
38+
(fn() => self::$basePath = null)->bindTo(null, Enums::class)();
39+
});

tests/Pest.php

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
|
2525
*/
2626

27+
use function Cerbero\Enum\className;
2728
use function Cerbero\Enum\cli;
29+
use function Cerbero\Enum\namespaceToPath;
2830

2931
expect()->extend('toAnnotate', function (array $enums, bool $overwrite = false) {
3032
$oldContents = [];
@@ -45,7 +47,7 @@
4547
}
4648

4749
foreach ($oldContents as $filename => $oldContent) {
48-
$stub = __DIR__ . '/stubs/' . basename($filename, '.php') . '.stub';
50+
$stub = __DIR__ . '/stubs/annotate/' . basename($filename, '.php') . '.stub';
4951

5052
if ($overwrite && file_exists($path = __DIR__ . '/stubs/' . basename($filename, '.php') . '.force.stub')) {
5153
$stub = $path;
@@ -64,6 +66,31 @@
6466
}
6567
});
6668

69+
expect()->extend('toGenerate', function (string $enum) {
70+
expect(class_exists($enum))->toBeFalse();
71+
72+
try {
73+
if (is_bool($value = ($this->value)())) {
74+
expect($value)->toBeTrue();
75+
} else {
76+
expect($value)
77+
->output->toContain($enum)
78+
->status->toBe(0);
79+
}
80+
81+
$filename = namespaceToPath($enum);
82+
$stub = sprintf('%s/stubs/%s/%s.stub', __DIR__, is_bool($value) ? 'generator' : 'make', className($enum));
83+
84+
// normalize content to avoid end-of-line incompatibility between OS
85+
$enumContent = str_replace("\r\n", "\n", file_get_contents($filename));
86+
$stubContent = str_replace("\r\n", "\n", file_get_contents($stub));
87+
88+
expect($enumContent)->toBe($stubContent);
89+
} finally {
90+
file_exists($filename) && unlink($filename);
91+
}
92+
});
93+
6794
/*
6895
|--------------------------------------------------------------------------
6996
| Functions
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Enums;
6+
7+
use Cerbero\Enum\Concerns\Enumerates;
8+
9+
enum Generated1: int
10+
{
11+
use Enumerates;
12+
13+
case CaseOne = 1 << 0;
14+
15+
case CaseTwo = 1 << 1;
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Domain\Common\Enums;
6+
7+
use Cerbero\Enum\Concerns\Enumerates;
8+
9+
enum Generated2: string
10+
{
11+
use Enumerates;
12+
13+
case CaseOne = 'case_one';
14+
15+
case CaseTwo = 'case_two';
16+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace SubDirectory;
6+
7+
use Cerbero\Enum\Concerns\Enumerates;
8+
9+
enum Generated3
10+
{
11+
use Enumerates;
12+
13+
case CaseOne;
14+
15+
case CaseTwo;
16+
}

tests/stubs/make/Generated1.stub

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Enums;
6+
7+
use Cerbero\Enum\Concerns\Enumerates;
8+
9+
/**
10+
* @method static int CaseOne()
11+
* @method static int CaseTwo()
12+
*/
13+
enum Generated1: int
14+
{
15+
use Enumerates;
16+
17+
case CaseOne = 1 << 0;
18+
19+
case CaseTwo = 1 << 1;
20+
}

tests/stubs/make/Generated2.stub

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Domain\Common\Enums;
6+
7+
use Cerbero\Enum\Concerns\Enumerates;
8+
9+
/**
10+
* @method static string CaseOne()
11+
* @method static string CaseTwo()
12+
*/
13+
enum Generated2: string
14+
{
15+
use Enumerates;
16+
17+
case CaseOne = 'case_one';
18+
19+
case CaseTwo = 'case_two';
20+
}

0 commit comments

Comments
 (0)