create-berna-stencil 2.0.9 → 2.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/bin/create.js +2 -1
- package/package.json +1 -1
- package/src/backend/_core/vendor/composer/autoload_static.php +10 -10
- package/src/backend/_core/vendor/composer/installed.json +6 -6
- package/src/backend/_core/vendor/composer/installed.php +2 -2
- package/src/backend/_core/vendor/graham-campbell/result-type/.gitattributes +9 -0
- package/src/backend/_core/vendor/graham-campbell/result-type/.github/CODE_OF_CONDUCT.md +132 -0
- package/src/backend/_core/vendor/graham-campbell/result-type/.github/CONTRIBUTING.md +31 -0
- package/src/backend/_core/vendor/graham-campbell/result-type/.github/FUNDING.yml +2 -0
- package/src/backend/_core/vendor/graham-campbell/result-type/.github/SECURITY.md +14 -0
- package/src/backend/_core/vendor/graham-campbell/result-type/.github/workflows/stale.yml +11 -0
- package/src/backend/_core/vendor/graham-campbell/result-type/.github/workflows/tests.yml +40 -0
- package/src/backend/_core/vendor/graham-campbell/result-type/CHANGELOG.md +53 -0
- package/src/backend/_core/vendor/graham-campbell/result-type/LICENSE +21 -21
- package/src/backend/_core/vendor/graham-campbell/result-type/README.md +42 -0
- package/src/backend/_core/vendor/graham-campbell/result-type/composer.json +33 -33
- package/src/backend/_core/vendor/graham-campbell/result-type/phpunit.xml.dist +13 -0
- package/src/backend/_core/vendor/graham-campbell/result-type/src/Error.php +121 -121
- package/src/backend/_core/vendor/graham-campbell/result-type/src/Result.php +69 -69
- package/src/backend/_core/vendor/graham-campbell/result-type/src/Success.php +120 -120
- package/src/backend/_core/vendor/graham-campbell/result-type/tests/ResultTest.php +95 -0
- package/src/backend/_core/vendor/phpoption/phpoption/.gitattributes +13 -0
- package/src/backend/_core/vendor/phpoption/phpoption/.github/CODE_OF_CONDUCT.md +132 -0
- package/src/backend/_core/vendor/phpoption/phpoption/.github/CONTRIBUTING.md +30 -0
- package/src/backend/_core/vendor/phpoption/phpoption/.github/FUNDING.yml +2 -0
- package/src/backend/_core/vendor/phpoption/phpoption/.github/SECURITY.md +14 -0
- package/src/backend/_core/vendor/phpoption/phpoption/.github/workflows/static.yml +40 -0
- package/src/backend/_core/vendor/phpoption/phpoption/.github/workflows/tests.yml +40 -0
- package/src/backend/_core/vendor/phpoption/phpoption/LICENSE +200 -200
- package/src/backend/_core/vendor/phpoption/phpoption/Makefile +17 -0
- package/src/backend/_core/vendor/phpoption/phpoption/README.md +201 -0
- package/src/backend/_core/vendor/phpoption/phpoption/composer.json +50 -50
- package/src/backend/_core/vendor/phpoption/phpoption/phpstan-baseline.neon +44 -0
- package/src/backend/_core/vendor/phpoption/phpoption/phpstan.neon.dist +7 -0
- package/src/backend/_core/vendor/phpoption/phpoption/phpunit.xml.dist +13 -0
- package/src/backend/_core/vendor/phpoption/phpoption/src/PhpOption/LazyOption.php +175 -175
- package/src/backend/_core/vendor/phpoption/phpoption/src/PhpOption/None.php +136 -136
- package/src/backend/_core/vendor/phpoption/phpoption/src/PhpOption/Option.php +434 -434
- package/src/backend/_core/vendor/phpoption/phpoption/src/PhpOption/Some.php +169 -169
- package/src/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/EnsureTest.php +72 -0
- package/src/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/LazyOptionTest.php +357 -0
- package/src/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/NoneTest.php +153 -0
- package/src/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/OptionTest.php +166 -0
- package/src/backend/_core/vendor/phpoption/phpoption/tests/PhpOption/Tests/SomeTest.php +194 -0
- package/src/backend/_core/vendor/phpoption/phpoption/tests/bootstrap.php +8 -0
- package/src/backend/_core/vendor/phpoption/phpoption/vendor-bin/phpstan/composer.json +8 -0
- package/src/backend/_core/vendor/symfony/polyfill-ctype/Ctype.php +232 -232
- package/src/backend/_core/vendor/symfony/polyfill-ctype/LICENSE +19 -19
- package/src/backend/_core/vendor/symfony/polyfill-ctype/README.md +12 -12
- package/src/backend/_core/vendor/symfony/polyfill-ctype/bootstrap.php +50 -50
- package/src/backend/_core/vendor/symfony/polyfill-ctype/bootstrap80.php +46 -46
- package/src/backend/_core/vendor/symfony/polyfill-ctype/composer.json +38 -38
- package/src/backend/_core/vendor/symfony/polyfill-mbstring/LICENSE +19 -19
- package/src/backend/_core/vendor/symfony/polyfill-mbstring/Mbstring.php +1077 -1077
- package/src/backend/_core/vendor/symfony/polyfill-mbstring/README.md +13 -13
- package/src/backend/_core/vendor/symfony/polyfill-mbstring/Resources/unidata/caseFolding.php +119 -119
- package/src/backend/_core/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php +1397 -1397
- package/src/backend/_core/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php +5 -5
- package/src/backend/_core/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php +1489 -1489
- package/src/backend/_core/vendor/symfony/polyfill-mbstring/bootstrap.php +171 -171
- package/src/backend/_core/vendor/symfony/polyfill-mbstring/bootstrap80.php +167 -167
- package/src/backend/_core/vendor/symfony/polyfill-mbstring/composer.json +39 -39
- package/src/backend/_core/vendor/symfony/polyfill-php80/LICENSE +19 -19
- package/src/backend/_core/vendor/symfony/polyfill-php80/Php80.php +115 -115
- package/src/backend/_core/vendor/symfony/polyfill-php80/PhpToken.php +106 -106
- package/src/backend/_core/vendor/symfony/polyfill-php80/README.md +25 -25
- package/src/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/Attribute.php +31 -31
- package/src/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/PhpToken.php +16 -16
- package/src/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/Stringable.php +20 -20
- package/src/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php +16 -16
- package/src/backend/_core/vendor/symfony/polyfill-php80/Resources/stubs/ValueError.php +16 -16
- package/src/backend/_core/vendor/symfony/polyfill-php80/bootstrap.php +42 -42
- package/src/backend/_core/vendor/symfony/polyfill-php80/composer.json +37 -37
- package/src/backend/_core/vendor/vlucas/phpdotenv/.editorconfig +15 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/.gitattributes +15 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/.github/CODE_OF_CONDUCT.md +132 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/.github/CONTRIBUTING.md +30 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/.github/FUNDING.yml +2 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/.github/SECURITY.md +14 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/.github/workflows/static.yml +40 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/.github/workflows/tests.yml +70 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/LICENSE +30 -30
- package/src/backend/_core/vendor/vlucas/phpdotenv/Makefile +17 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/README.md +370 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/UPGRADING.md +196 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/composer.json +60 -60
- package/src/backend/_core/vendor/vlucas/phpdotenv/phpstan-baseline.neon +157 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/phpstan.neon.dist +7 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/phpunit.xml.dist +13 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Dotenv.php +267 -267
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Exception/ExceptionInterface.php +12 -12
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Exception/InvalidEncodingException.php +12 -12
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Exception/InvalidFileException.php +12 -12
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Exception/InvalidPathException.php +12 -12
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Exception/ValidationException.php +12 -12
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Loader/Loader.php +48 -48
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Loader/LoaderInterface.php +20 -20
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Loader/Resolver.php +65 -65
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Entry.php +59 -59
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Parser/EntryParser.php +299 -299
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Lexer.php +58 -58
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Lines.php +127 -127
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Parser.php +53 -53
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Parser/ParserInterface.php +19 -19
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Parser/Value.php +88 -88
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/AdapterInterface.php +15 -15
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ApacheAdapter.php +89 -89
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ArrayAdapter.php +80 -80
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/EnvConstAdapter.php +88 -88
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/GuardedWriter.php +85 -85
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ImmutableWriter.php +110 -110
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiReader.php +48 -48
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/MultiWriter.php +64 -64
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/PutenvAdapter.php +91 -91
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReaderInterface.php +17 -17
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ReplacingWriter.php +104 -104
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/ServerConstAdapter.php +88 -88
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/Adapter/WriterInterface.php +27 -27
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/AdapterRepository.php +107 -107
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/RepositoryBuilder.php +272 -272
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Repository/RepositoryInterface.php +51 -51
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Store/File/Paths.php +44 -44
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Store/File/Reader.php +81 -81
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Store/FileStore.php +72 -72
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Store/StoreBuilder.php +141 -141
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Store/StoreInterface.php +17 -17
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Store/StringStore.php +37 -37
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Util/Regex.php +112 -112
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Util/Str.php +108 -108
- package/src/backend/_core/vendor/vlucas/phpdotenv/src/Validator.php +207 -207
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/DotenvTest.php +387 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Loader/LoaderTest.php +86 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Parser/EntryParserTest.php +234 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Parser/LexerTest.php +40 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Parser/LinesTest.php +53 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Parser/ParserTest.php +98 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/Adapter/ArrayAdapterTest.php +57 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/Adapter/EnvConstAdapterTest.php +75 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/Adapter/PutenvAdapterTest.php +52 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/Adapter/ServerConstAdapterTest.php +75 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Repository/RepositoryTest.php +305 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/Store/StoreTest.php +141 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/Dotenv/ValidatorTest.php +479 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/.env +5 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/assertions.env +18 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/booleans.env +33 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/commented.env +15 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/empty.env +1 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/example.env +1 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/exported.env +7 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/immutable.env +1 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/integers.env +17 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/large.env +2 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/multibyte.env +3 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/multiline.env +14 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/multiple.env +4 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/mutable.env +1 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/nested.env +15 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/quoted.env +11 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/specialchars.env +8 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/unicodevarnames.env +2 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/utf8-with-bom-encoding.env +3 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/tests/fixtures/env/windows.env +1 -0
- package/src/backend/_core/vendor/vlucas/phpdotenv/vendor-bin/phpstan/composer.json +15 -0
- package/src/backend/config.php +19 -0
- package/src/frontend/data/site.json +43 -43
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace PhpOption\Tests;
|
|
4
|
+
|
|
5
|
+
use PhpOption\LazyOption;
|
|
6
|
+
use PhpOption\None;
|
|
7
|
+
use PhpOption\Option;
|
|
8
|
+
use PhpOption\Some;
|
|
9
|
+
use PHPUnit\Framework\TestCase;
|
|
10
|
+
|
|
11
|
+
class LazyOptionTest extends TestCase
|
|
12
|
+
{
|
|
13
|
+
private static function createSubject($default = null): object
|
|
14
|
+
{
|
|
15
|
+
return new class ($default) {
|
|
16
|
+
private $default;
|
|
17
|
+
|
|
18
|
+
public function __construct($default)
|
|
19
|
+
{
|
|
20
|
+
$this->default = $default;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public function execute($v = null): Option
|
|
24
|
+
{
|
|
25
|
+
return Option::fromValue($v ?? $this->default);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
private static function createInvalidSubject(): object
|
|
31
|
+
{
|
|
32
|
+
return new class {
|
|
33
|
+
public function execute($v = null)
|
|
34
|
+
{
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
public function testGetWithArgumentsAndConstructor(): void
|
|
41
|
+
{
|
|
42
|
+
$some = LazyOption::create([self::createSubject(), 'execute'], ['foo']);
|
|
43
|
+
|
|
44
|
+
self::assertSame('foo', $some->get());
|
|
45
|
+
self::assertSame('foo', $some->getOrElse(null));
|
|
46
|
+
self::assertSame('foo', $some->getOrCall('does_not_exist'));
|
|
47
|
+
self::assertSame('foo', $some->getOrThrow(new \RuntimeException('does_not_exist')));
|
|
48
|
+
self::assertFalse($some->isEmpty());
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public function testGetWithArgumentsAndCreate(): void
|
|
52
|
+
{
|
|
53
|
+
$some = new LazyOption([self::createSubject(), 'execute'], ['foo']);
|
|
54
|
+
|
|
55
|
+
self::assertSame('foo', $some->get());
|
|
56
|
+
self::assertSame('foo', $some->getOrElse(null));
|
|
57
|
+
self::assertSame('foo', $some->getOrCall('does_not_exist'));
|
|
58
|
+
self::assertSame('foo', $some->getOrThrow(new \RuntimeException('does_not_exist')));
|
|
59
|
+
self::assertFalse($some->isEmpty());
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
public function testGetWithoutArgumentsAndConstructor(): void
|
|
63
|
+
{
|
|
64
|
+
$some = new LazyOption([self::createSubject('foo'), 'execute']);
|
|
65
|
+
|
|
66
|
+
self::assertSame('foo', $some->get());
|
|
67
|
+
self::assertSame('foo', $some->getOrElse(null));
|
|
68
|
+
self::assertSame('foo', $some->getOrCall('does_not_exist'));
|
|
69
|
+
self::assertSame('foo', $some->getOrThrow(new \RuntimeException('does_not_exist')));
|
|
70
|
+
self::assertFalse($some->isEmpty());
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public function testGetWithoutArgumentsAndCreate(): void
|
|
74
|
+
{
|
|
75
|
+
$option = LazyOption::create([self::createSubject('foo'), 'execute']);
|
|
76
|
+
|
|
77
|
+
self::assertTrue($option->isDefined());
|
|
78
|
+
self::assertFalse($option->isEmpty());
|
|
79
|
+
self::assertSame('foo', $option->get());
|
|
80
|
+
self::assertSame('foo', $option->getOrElse(null));
|
|
81
|
+
self::assertSame('foo', $option->getOrCall('does_not_exist'));
|
|
82
|
+
self::assertSame('foo', $option->getOrThrow(new \RuntimeException('does_not_exist')));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public function testCallbackReturnsNull(): void
|
|
86
|
+
{
|
|
87
|
+
if (method_exists($this, 'expectException')) {
|
|
88
|
+
$this->expectException('RuntimeException');
|
|
89
|
+
$this->expectExceptionMessage('None has no value');
|
|
90
|
+
} else {
|
|
91
|
+
$this->setExpectedException('RuntimeException', 'None has no value');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
$option = LazyOption::create([self::createSubject(), 'execute']);
|
|
95
|
+
|
|
96
|
+
self::assertFalse($option->isDefined());
|
|
97
|
+
self::assertTrue($option->isEmpty());
|
|
98
|
+
self::assertSame('alt', $option->getOrElse('alt'));
|
|
99
|
+
self::assertSame('alt', $option->getOrCall(function () {
|
|
100
|
+
return 'alt';
|
|
101
|
+
}));
|
|
102
|
+
|
|
103
|
+
$option->get();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
public function testExceptionIsThrownIfCallbackReturnsNonOption(): void
|
|
107
|
+
{
|
|
108
|
+
$option = LazyOption::create([self::createInvalidSubject(), 'execute']);
|
|
109
|
+
|
|
110
|
+
if (method_exists($this, 'expectException')) {
|
|
111
|
+
$this->expectException('RuntimeException');
|
|
112
|
+
$this->expectExceptionMessage('Expected instance of PhpOption\Option');
|
|
113
|
+
} else {
|
|
114
|
+
$this->setExpectedException('RuntimeException', 'Expected instance of PhpOption\Option');
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
$option->isDefined();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
public function testInvalidCallbackAndConstructor(): void
|
|
121
|
+
{
|
|
122
|
+
if (method_exists($this, 'expectException')) {
|
|
123
|
+
$this->expectException('InvalidArgumentException');
|
|
124
|
+
$this->expectExceptionMessage('Invalid callback given');
|
|
125
|
+
} else {
|
|
126
|
+
$this->setExpectedException('InvalidArgumentException', 'Invalid callback given');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
new LazyOption('invalidCallback');
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
public function testInvalidCallbackAndCreate(): void
|
|
133
|
+
{
|
|
134
|
+
if (method_exists($this, 'expectException')) {
|
|
135
|
+
$this->expectException('InvalidArgumentException');
|
|
136
|
+
$this->expectExceptionMessage('Invalid callback given');
|
|
137
|
+
} else {
|
|
138
|
+
$this->setExpectedException('InvalidArgumentException', 'Invalid callback given');
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
LazyOption::create('invalidCallback');
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
public function testifDefined(): void
|
|
145
|
+
{
|
|
146
|
+
$called = false;
|
|
147
|
+
$self = $this;
|
|
148
|
+
LazyOption::fromValue('foo')->ifDefined(function ($v) use (&$called, $self) {
|
|
149
|
+
$called = true;
|
|
150
|
+
$self->assertSame('foo', $v);
|
|
151
|
+
});
|
|
152
|
+
self::assertTrue($called);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
public function testForAll(): void
|
|
156
|
+
{
|
|
157
|
+
$called = false;
|
|
158
|
+
$self = $this;
|
|
159
|
+
self::assertInstanceOf(Some::class, LazyOption::fromValue('foo')->forAll(function ($v) use (&$called, $self) {
|
|
160
|
+
$called = true;
|
|
161
|
+
$self->assertSame('foo', $v);
|
|
162
|
+
}));
|
|
163
|
+
self::assertTrue($called);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
public function testOrElse(): void
|
|
167
|
+
{
|
|
168
|
+
$some = Some::create('foo');
|
|
169
|
+
$lazy = LazyOption::create(function () use ($some) {
|
|
170
|
+
return $some;
|
|
171
|
+
});
|
|
172
|
+
self::assertSame($some, $lazy->orElse(None::create()));
|
|
173
|
+
self::assertSame($some, $lazy->orElse(Some::create('bar')));
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
public function testFoldLeftRight(): void
|
|
177
|
+
{
|
|
178
|
+
$callback = function () {
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
// Use TestOption as a concrete implementation to test with
|
|
182
|
+
$option = self::createPartialMock(TestOption::class, ['foldLeft', 'foldRight']);
|
|
183
|
+
$option->expects(self::once())
|
|
184
|
+
->method('foldLeft')
|
|
185
|
+
->with(5, $callback)
|
|
186
|
+
->willReturn(6);
|
|
187
|
+
$lazyOption = new LazyOption(function () use ($option) {
|
|
188
|
+
return $option;
|
|
189
|
+
});
|
|
190
|
+
self::assertSame(6, $lazyOption->foldLeft(5, $callback));
|
|
191
|
+
|
|
192
|
+
$option->expects(self::once())
|
|
193
|
+
->method('foldRight')
|
|
194
|
+
->with(5, $callback)
|
|
195
|
+
->willReturn(6);
|
|
196
|
+
$lazyOption = new LazyOption(function () use ($option) {
|
|
197
|
+
return $option;
|
|
198
|
+
});
|
|
199
|
+
self::assertSame(6, $lazyOption->foldRight(5, $callback));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
class TestOption extends Option
|
|
204
|
+
{
|
|
205
|
+
private $value;
|
|
206
|
+
|
|
207
|
+
public function __construct($value = null)
|
|
208
|
+
{
|
|
209
|
+
$this->value = $value;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
public function get()
|
|
213
|
+
{
|
|
214
|
+
return $this->value;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
public function getOrElse($default)
|
|
218
|
+
{
|
|
219
|
+
if ($this->isDefined()) {
|
|
220
|
+
return $this->value;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return $default;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
public function getOrCall($callable)
|
|
227
|
+
{
|
|
228
|
+
if ($this->isDefined()) {
|
|
229
|
+
return $this->value;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
return call_user_func($callable);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
public function getOrThrow(\Exception $ex)
|
|
236
|
+
{
|
|
237
|
+
if ($this->isDefined()) {
|
|
238
|
+
return $this->value;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
throw $ex;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
public function isEmpty()
|
|
245
|
+
{
|
|
246
|
+
return $this->value === null;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
public function isDefined()
|
|
250
|
+
{
|
|
251
|
+
return $this->value !== null;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
public function orElse(Option $else)
|
|
255
|
+
{
|
|
256
|
+
if ($this->isDefined()) {
|
|
257
|
+
return $this;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return $else;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
public function ifDefined($callable)
|
|
264
|
+
{
|
|
265
|
+
if ($this->isDefined()) {
|
|
266
|
+
call_user_func($callable, $this->value);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
public function forAll($callable)
|
|
271
|
+
{
|
|
272
|
+
if ($this->isDefined()) {
|
|
273
|
+
call_user_func($callable, $this->value);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
public function map($callable)
|
|
278
|
+
{
|
|
279
|
+
if ($this->isDefined()) {
|
|
280
|
+
return new self(call_user_func($callable, $this->value));
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
return $this;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
public function flatMap($callable)
|
|
287
|
+
{
|
|
288
|
+
if ($this->isDefined()) {
|
|
289
|
+
return call_user_func($callable, $this->value);
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
return $this;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
public function filter($callable)
|
|
296
|
+
{
|
|
297
|
+
if ($this->isDefined() && call_user_func($callable, $this->value)) {
|
|
298
|
+
return $this;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
return None::create();
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
public function filterNot($callable)
|
|
305
|
+
{
|
|
306
|
+
if ($this->isDefined() && !call_user_func($callable, $this->value)) {
|
|
307
|
+
return $this;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
return None::create();
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
public function select($value)
|
|
314
|
+
{
|
|
315
|
+
if ($this->isDefined() && $this->value === $value) {
|
|
316
|
+
return $this;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
return None::create();
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
public function reject($value)
|
|
323
|
+
{
|
|
324
|
+
if ($this->isDefined() && $this->value !== $value) {
|
|
325
|
+
return $this;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
return None::create();
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
public function foldLeft($initialValue, $callable)
|
|
332
|
+
{
|
|
333
|
+
if ($this->isDefined()) {
|
|
334
|
+
return call_user_func($callable, $initialValue, $this->value);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
return $initialValue;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
public function foldRight($initialValue, $callable)
|
|
341
|
+
{
|
|
342
|
+
if ($this->isDefined()) {
|
|
343
|
+
return call_user_func($callable, $this->value, $initialValue);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
return $initialValue;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
public function getIterator(): \Traversable
|
|
350
|
+
{
|
|
351
|
+
if ($this->isDefined()) {
|
|
352
|
+
return new \ArrayIterator([$this->value]);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
return new \ArrayIterator([]);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace PhpOption\Tests;
|
|
4
|
+
|
|
5
|
+
use PhpOption\None;
|
|
6
|
+
use PhpOption\Some;
|
|
7
|
+
use PHPUnit\Framework\TestCase;
|
|
8
|
+
|
|
9
|
+
class NoneTest extends TestCase
|
|
10
|
+
{
|
|
11
|
+
public function testGet(): void
|
|
12
|
+
{
|
|
13
|
+
if (method_exists($this, 'expectException')) {
|
|
14
|
+
$this->expectException('RuntimeException');
|
|
15
|
+
} else {
|
|
16
|
+
$this->setExpectedException('RuntimeException');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
$none = None::create();
|
|
20
|
+
$none->get();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public function testGetOrElse(): void
|
|
24
|
+
{
|
|
25
|
+
$none = None::create();
|
|
26
|
+
self::assertSame('foo', $none->getOrElse('foo'));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public function testGetOrCall(): void
|
|
30
|
+
{
|
|
31
|
+
$none = None::create();
|
|
32
|
+
self::assertSame('foo', $none->getOrCall(function () {
|
|
33
|
+
return 'foo';
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public function testGetOrThrow(): void
|
|
38
|
+
{
|
|
39
|
+
if (method_exists($this, 'expectException')) {
|
|
40
|
+
$this->expectException('RuntimeException');
|
|
41
|
+
$this->expectExceptionMessage('Not Found!');
|
|
42
|
+
} else {
|
|
43
|
+
$this->setExpectedException('RuntimeException', 'Not Found!');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
None::create()->getOrThrow(new \RuntimeException('Not Found!'));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public function testIsEmpty(): void
|
|
50
|
+
{
|
|
51
|
+
$none = None::create();
|
|
52
|
+
self::assertTrue($none->isEmpty());
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public function testOrElse(): void
|
|
56
|
+
{
|
|
57
|
+
$option = Some::create('foo');
|
|
58
|
+
self::assertSame($option, None::create()->orElse($option));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
public function testifDefined(): void
|
|
62
|
+
{
|
|
63
|
+
$none = None::create();
|
|
64
|
+
|
|
65
|
+
self::assertNull($none->ifDefined(function () {
|
|
66
|
+
throw new \LogicException('Should never be called.');
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public function testForAll(): void
|
|
71
|
+
{
|
|
72
|
+
$none = None::create();
|
|
73
|
+
|
|
74
|
+
self::assertSame($none, $none->forAll(function () {
|
|
75
|
+
throw new \LogicException('Should never be called.');
|
|
76
|
+
}));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
public function testMap(): void
|
|
80
|
+
{
|
|
81
|
+
$none = None::create();
|
|
82
|
+
|
|
83
|
+
self::assertSame($none, $none->map(function () {
|
|
84
|
+
throw new \LogicException('Should not be called.');
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
public function testFlatMap(): void
|
|
89
|
+
{
|
|
90
|
+
$none = None::create();
|
|
91
|
+
|
|
92
|
+
self::assertSame($none, $none->flatMap(function () {
|
|
93
|
+
throw new \LogicException('Should not be called.');
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
public function testFilter(): void
|
|
98
|
+
{
|
|
99
|
+
$none = None::create();
|
|
100
|
+
|
|
101
|
+
self::assertSame($none, $none->filter(function () {
|
|
102
|
+
throw new \LogicException('Should not be called.');
|
|
103
|
+
}));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
public function testFilterNot(): void
|
|
107
|
+
{
|
|
108
|
+
$none = None::create();
|
|
109
|
+
|
|
110
|
+
self::assertSame($none, $none->filterNot(function () {
|
|
111
|
+
throw new \LogicException('Should not be called.');
|
|
112
|
+
}));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
public function testSelect(): void
|
|
116
|
+
{
|
|
117
|
+
$none = None::create();
|
|
118
|
+
|
|
119
|
+
self::assertSame($none, $none->select(null));
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
public function testReject(): void
|
|
123
|
+
{
|
|
124
|
+
$none = None::create();
|
|
125
|
+
|
|
126
|
+
self::assertSame($none, $none->reject(null));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
public function testForeach(): void
|
|
130
|
+
{
|
|
131
|
+
$none = None::create();
|
|
132
|
+
|
|
133
|
+
$called = 0;
|
|
134
|
+
foreach ($none as $value) {
|
|
135
|
+
$called++;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
self::assertSame(0, $called);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
public function testFoldLeftRight(): void
|
|
142
|
+
{
|
|
143
|
+
$none = None::create();
|
|
144
|
+
|
|
145
|
+
self::assertSame(1, $none->foldLeft(1, function () {
|
|
146
|
+
$this->fail();
|
|
147
|
+
}));
|
|
148
|
+
|
|
149
|
+
self::assertSame(1, $none->foldRight(1, function () {
|
|
150
|
+
$this->fail();
|
|
151
|
+
}));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
<?php
|
|
2
|
+
|
|
3
|
+
namespace PhpOption\Tests;
|
|
4
|
+
|
|
5
|
+
use ArrayAccess;
|
|
6
|
+
use LogicException;
|
|
7
|
+
use PhpOption\LazyOption;
|
|
8
|
+
use PhpOption\None;
|
|
9
|
+
use PhpOption\Option;
|
|
10
|
+
use PhpOption\Some;
|
|
11
|
+
use PHPUnit\Framework\TestCase;
|
|
12
|
+
|
|
13
|
+
class OptionTest extends TestCase
|
|
14
|
+
{
|
|
15
|
+
public function testfromValueWithDefaultNoneValue(): void
|
|
16
|
+
{
|
|
17
|
+
self::assertInstanceOf(None::class, Option::fromValue(null));
|
|
18
|
+
self::assertInstanceOf(Some::class, Option::fromValue('value'));
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
public function testFromValueWithFalseNoneValue(): void
|
|
22
|
+
{
|
|
23
|
+
self::assertInstanceOf(None::class, Option::fromValue(false, false));
|
|
24
|
+
self::assertInstanceOf(Some::class, Option::fromValue('value', false));
|
|
25
|
+
self::assertInstanceOf(Some::class, Option::fromValue(null, false));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public function testFromArraysValue(): void
|
|
29
|
+
{
|
|
30
|
+
self::assertEquals(None::create(), Option::fromArraysValue('foo', 'bar'));
|
|
31
|
+
self::assertEquals(None::create(), Option::fromArraysValue(null, 'bar'));
|
|
32
|
+
self::assertEquals(None::create(), Option::fromArraysValue(['foo' => 'bar'], 'baz'));
|
|
33
|
+
self::assertEquals(None::create(), Option::fromArraysValue(['foo' => null], 'foo'));
|
|
34
|
+
self::assertEquals(None::create(), Option::fromArraysValue(['foo' => 'bar'], null));
|
|
35
|
+
self::assertEquals(new Some('foo'), Option::fromArraysValue(['foo' => 'foo'], 'foo'));
|
|
36
|
+
self::assertEquals(new Some('foo'), Option::fromArraysValue([13 => 'foo'], 13));
|
|
37
|
+
|
|
38
|
+
$object = new SomeArrayObject();
|
|
39
|
+
$object['foo'] = 'foo';
|
|
40
|
+
self::assertEquals(new Some('foo'), Option::fromArraysValue($object, 'foo'));
|
|
41
|
+
|
|
42
|
+
$object = new SomeArrayObject();
|
|
43
|
+
$object[13] = 'foo';
|
|
44
|
+
self::assertEquals(new Some('foo'), Option::fromArraysValue($object, 13));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public function testFromReturn(): void
|
|
48
|
+
{
|
|
49
|
+
$null = function () {
|
|
50
|
+
};
|
|
51
|
+
$false = function () {
|
|
52
|
+
return false;
|
|
53
|
+
};
|
|
54
|
+
$some = function () {
|
|
55
|
+
return 'foo';
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
self::assertTrue(Option::fromReturn($null)->isEmpty());
|
|
59
|
+
self::assertFalse(Option::fromReturn($false)->isEmpty());
|
|
60
|
+
self::assertTrue(Option::fromReturn($false, [], false)->isEmpty());
|
|
61
|
+
self::assertTrue(Option::fromReturn($some)->isDefined());
|
|
62
|
+
self::assertFalse(Option::fromReturn($some, [], 'foo')->isDefined());
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public function testOrElse(): void
|
|
66
|
+
{
|
|
67
|
+
$a = new Some('a');
|
|
68
|
+
$b = new Some('b');
|
|
69
|
+
|
|
70
|
+
self::assertSame('a', $a->orElse($b)->get());
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public function testOrElseWithNoneAsFirst(): void
|
|
74
|
+
{
|
|
75
|
+
$a = None::create();
|
|
76
|
+
$b = new Some('b');
|
|
77
|
+
|
|
78
|
+
self::assertSame('b', $a->orElse($b)->get());
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public function testOrElseWithLazyOptions(): void
|
|
82
|
+
{
|
|
83
|
+
$throws = function () {
|
|
84
|
+
throw new LogicException('Should never be called.');
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
$a = new Some('a');
|
|
88
|
+
$b = new LazyOption($throws);
|
|
89
|
+
|
|
90
|
+
self::assertSame('a', $a->orElse($b)->get());
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
public function testOrElseWithMultipleAlternatives(): void
|
|
94
|
+
{
|
|
95
|
+
$throws = new LazyOption(function () {
|
|
96
|
+
throw new LogicException('Should never be called.');
|
|
97
|
+
});
|
|
98
|
+
$returns = new LazyOption(function () {
|
|
99
|
+
return new Some('foo');
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
$a = None::create();
|
|
103
|
+
|
|
104
|
+
self::assertSame('foo', $a->orElse($returns)->orElse($throws)->get());
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
public function testLift(): void
|
|
108
|
+
{
|
|
109
|
+
$f = function ($a, $b) {
|
|
110
|
+
return $a + $b;
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
$fL = Option::lift($f);
|
|
114
|
+
|
|
115
|
+
$a = new Some(1);
|
|
116
|
+
$b = new Some(5);
|
|
117
|
+
$n = None::create();
|
|
118
|
+
|
|
119
|
+
self::assertSame(6, $fL($a, $b)->get());
|
|
120
|
+
self::assertSame(6, $fL($b, $a)->get());
|
|
121
|
+
self::assertSame($n, $fL($a, $n));
|
|
122
|
+
self::assertSame($n, $fL($n, $a));
|
|
123
|
+
self::assertSame($n, $fL($n, $n));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
public function testLiftDegenerate(): void
|
|
127
|
+
{
|
|
128
|
+
$f = function () {
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
$fL1 = Option::lift($f);
|
|
132
|
+
$fL2 = Option::lift($f, false);
|
|
133
|
+
|
|
134
|
+
self::assertEquals(None::create(), $fL1());
|
|
135
|
+
self::assertEquals(Some::create(null), $fL2());
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
class SomeArrayObject implements ArrayAccess
|
|
140
|
+
{
|
|
141
|
+
private $data = [];
|
|
142
|
+
|
|
143
|
+
#[\ReturnTypeWillChange]
|
|
144
|
+
public function offsetExists($offset)
|
|
145
|
+
{
|
|
146
|
+
return isset($this->data[$offset]);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
#[\ReturnTypeWillChange]
|
|
150
|
+
public function offsetGet($offset)
|
|
151
|
+
{
|
|
152
|
+
return $this->data[$offset];
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
#[\ReturnTypeWillChange]
|
|
156
|
+
public function offsetSet($offset, $value)
|
|
157
|
+
{
|
|
158
|
+
$this->data[$offset] = $value;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
#[\ReturnTypeWillChange]
|
|
162
|
+
public function offsetUnset($offset)
|
|
163
|
+
{
|
|
164
|
+
unset($this->data[$offset]);
|
|
165
|
+
}
|
|
166
|
+
}
|