Skip to content

Commit 99994f6

Browse files
committed
feat: Add LimitedArrayList and LimitedMap classes with element count restrictions and corresponding tests
1 parent be6354d commit 99994f6

File tree

6 files changed

+193
-43
lines changed

6 files changed

+193
-43
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace WizDevelop\PhpValueObject\Examples\Collection;
6+
7+
use Override;
8+
use WizDevelop\PhpValueObject\Collection\ArrayList;
9+
10+
/**
11+
* 要素数制限付きArrayList
12+
*
13+
* @template TValue
14+
* @extends ArrayList<TValue>
15+
*/
16+
final readonly class LimitedArrayList extends ArrayList
17+
{
18+
/**
19+
* 最小要素数
20+
*/
21+
#[Override]
22+
protected static function minCount(): int
23+
{
24+
return 2; // 2要素以上必要
25+
}
26+
27+
/**
28+
* 最大要素数
29+
*/
30+
#[Override]
31+
protected static function maxCount(): int
32+
{
33+
return 5; // 5要素以下必要
34+
}
35+
}

examples/Collection/LimitedMap.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace WizDevelop\PhpValueObject\Examples\Collection;
6+
7+
use Override;
8+
use WizDevelop\PhpValueObject\Collection\Map;
9+
10+
/**
11+
* 要素数制限付きMap
12+
*
13+
* @template TKey
14+
* @template TValue
15+
* @extends Map<TKey,TValue>
16+
*/
17+
final readonly class LimitedMap extends Map
18+
{
19+
/**
20+
* 最小要素数
21+
*/
22+
#[Override]
23+
protected static function minCount(): int
24+
{
25+
return 2; // 2要素以上必要
26+
}
27+
28+
/**
29+
* 最大要素数
30+
*/
31+
#[Override]
32+
protected static function maxCount(): int
33+
{
34+
return 5; // 5要素以下必要
35+
}
36+
}

tests/Unit/Collection/ArrayListTest.php

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -137,26 +137,6 @@ public function tryFrom静的メソッドで有効な配列から成功結果が
137137
$this->assertEquals($elements, $collection->toArray());
138138
}
139139

140-
#[Test]
141-
public function tryFrom静的メソッドで無効な配列からエラー結果が取得できる(): void
142-
{
143-
// ArrayListの実装では現在、最小カウントは0、最大カウントはPHP_INT_MAXなので
144-
// 常に有効な結果になるはずだが、将来的な制約変更に備えてテストを追加
145-
146-
// 今後最小カウント制約が追加された場合のテスト
147-
// この例では現在は常に成功するが、将来的に最小カウントが増えた場合を想定
148-
$result = ArrayList::tryFrom([]);
149-
150-
// 最大カウント制約のテスト用の大きな配列を用意する
151-
// 注: PHP_INT_MAXの配列は作れないので、実用的なテスト範囲で十分
152-
$bigArray = array_fill(0, 1000, 'test');
153-
$resultBig = ArrayList::tryFrom($bigArray);
154-
155-
// 現在の実装では両方成功するはず
156-
$this->assertTrue($result->isOk());
157-
$this->assertTrue($resultBig->isOk());
158-
}
159-
160140
#[Test]
161141
public function first関数で先頭要素が取得できる(): void
162142
{
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace WizDevelop\PhpValueObject\Tests\Unit\Collection;
6+
7+
use PHPUnit\Framework\Attributes\CoversClass;
8+
use PHPUnit\Framework\Attributes\Test;
9+
use PHPUnit\Framework\Attributes\TestDox;
10+
use PHPUnit\Framework\TestCase;
11+
use WizDevelop\PhpValueObject\Examples\Collection\LimitedArrayList;
12+
13+
#[TestDox('LimitedArrayListクラスのテスト')]
14+
#[CoversClass(LimitedArrayList::class)]
15+
final class LimitedArrayListTest extends TestCase
16+
{
17+
#[Test]
18+
public function tryFrom静的メソッドで有効な配列から成功結果が取得できる(): void
19+
{
20+
// 有効な範囲(2〜5要素)
21+
$validElements = [1, 2, 3];
22+
$result = LimitedArrayList::tryFrom($validElements);
23+
24+
$this->assertTrue($result->isOk());
25+
$collection = $result->unwrap();
26+
$this->assertInstanceOf(LimitedArrayList::class, $collection);
27+
$this->assertEquals($validElements, $collection->toArray());
28+
}
29+
30+
#[Test]
31+
public function tryFrom静的メソッドで最小要素数を下回る配列からエラー結果が取得できる(): void
32+
{
33+
// 最小要素数違反(1要素しかない)
34+
$tooFewElements = [1];
35+
$result = LimitedArrayList::tryFrom($tooFewElements);
36+
37+
$this->assertTrue($result->isErr());
38+
}
39+
40+
#[Test]
41+
public function tryFrom静的メソッドで最大要素数を超える配列からエラー結果が取得できる(): void
42+
{
43+
// 最大要素数違反(6要素ある)
44+
$tooManyElements = [1, 2, 3, 4, 5, 6];
45+
$result = LimitedArrayList::tryFrom($tooManyElements);
46+
47+
$this->assertTrue($result->isErr());
48+
}
49+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace WizDevelop\PhpValueObject\Tests\Unit\Collection;
6+
7+
use PHPUnit\Framework\Attributes\CoversClass;
8+
use PHPUnit\Framework\Attributes\Test;
9+
use PHPUnit\Framework\Attributes\TestDox;
10+
use PHPUnit\Framework\TestCase;
11+
use WizDevelop\PhpValueObject\Collection\Pair;
12+
use WizDevelop\PhpValueObject\Examples\Collection\LimitedMap;
13+
14+
#[TestDox('LimitedMapクラスのテスト')]
15+
#[CoversClass(LimitedMap::class)]
16+
final class LimitedMapTest extends TestCase
17+
{
18+
#[Test]
19+
public function tryFrom静的メソッドで有効なPair配列から成功結果が取得できる(): void
20+
{
21+
// 有効な範囲(2〜5要素)
22+
$validPairs = [
23+
Pair::of('key1', 'value1'),
24+
Pair::of('key2', 'value2'),
25+
Pair::of('key3', 'value3'),
26+
];
27+
28+
$result = LimitedMap::tryFrom(...$validPairs);
29+
30+
$this->assertTrue($result->isOk());
31+
$map = $result->unwrap();
32+
$this->assertInstanceOf(LimitedMap::class, $map);
33+
34+
$expected = [
35+
'key1' => 'value1',
36+
'key2' => 'value2',
37+
'key3' => 'value3',
38+
];
39+
40+
$this->assertEquals($expected, $map->toArray());
41+
}
42+
43+
#[Test]
44+
public function tryFrom静的メソッドで最小要素数を下回るPair配列からエラー結果が取得できる(): void
45+
{
46+
// 最小要素数違反(1要素しかない)
47+
$tooFewPairs = [
48+
Pair::of('key1', 'value1'),
49+
];
50+
51+
$result = LimitedMap::tryFrom(...$tooFewPairs);
52+
53+
$this->assertTrue($result->isErr());
54+
}
55+
56+
#[Test]
57+
public function tryFrom静的メソッドで最大要素数を超えるPair配列からエラー結果が取得できる(): void
58+
{
59+
// 最大要素数違反(6要素ある)
60+
$tooManyPairs = [
61+
Pair::of('key1', 'value1'),
62+
Pair::of('key2', 'value2'),
63+
Pair::of('key3', 'value3'),
64+
Pair::of('key4', 'value4'),
65+
Pair::of('key5', 'value5'),
66+
Pair::of('key6', 'value6'),
67+
];
68+
69+
$result = LimitedMap::tryFrom(...$tooManyPairs);
70+
71+
$this->assertTrue($result->isErr());
72+
}
73+
}

tests/Unit/Collection/MapTest.php

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -227,29 +227,6 @@ public function tryFrom静的メソッドで独自クラスを含むPair配列
227227
$this->assertEquals($expected, $collection->toArray());
228228
}
229229

230-
#[Test]
231-
public function tryFrom静的メソッドで無効なPair配列からエラー結果が取得できる(): void
232-
{
233-
// Mapの実装では現在、最小カウントは0、最大カウントはPHP_INT_MAXなので
234-
// 常に有効な結果になるはずだが、将来的な制約変更に備えてテストを追加
235-
236-
// 今後最小カウント制約が追加された場合のテスト
237-
// この例では現在は常に成功するが、将来的に最小カウントが増えた場合を想定
238-
$result = Map::tryFrom();
239-
240-
// 最大カウント制約のテスト用の大きなPair配列を用意する
241-
// 注: PHP_INT_MAXの配列は作れないので、実用的なテスト範囲で十分
242-
$bigArray = [];
243-
for ($i = 0; $i < 1000; ++$i) {
244-
$bigArray[] = Pair::of("key{$i}", "value{$i}");
245-
}
246-
$resultBig = Map::tryFrom(...$bigArray);
247-
248-
// 現在の実装では両方成功するはず
249-
$this->assertTrue($result->isOk());
250-
$this->assertTrue($resultBig->isOk());
251-
}
252-
253230
#[Test]
254231
public function put関数でキーと値を追加したコレクションが取得できる(): void
255232
{

0 commit comments

Comments
 (0)