Skip to content

Commit 43606be

Browse files
committed
feature: getTypedArray
closes #59
1 parent 31bdb17 commit 43606be

2 files changed

Lines changed: 138 additions & 1 deletion

File tree

src/Cache.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,58 @@ public function getArray(string $name, callable $callback):array {
7373
return $value;
7474
}
7575

76+
/**
77+
* @template T
78+
* @param class-string<T> $className
79+
* @return array<T>
80+
*/
81+
public function getTypedArray(string $name, string $className, callable $callback):array {
82+
$array = $this->get($name, $callback);
83+
if(!is_array($array)) {
84+
throw new TypeError("Value with key '$name' is not an array");
85+
}
86+
87+
foreach($array as $key => $value) {
88+
if($className === "int" || $className === "integer") {
89+
if(!is_int($value)) {
90+
if(is_numeric($value)) {
91+
$array[$key] = (int)$value;
92+
}
93+
else {
94+
throw new TypeError("Array value at key '$key' is not an integer");
95+
}
96+
}
97+
}
98+
elseif($className === "float" || $className === "double") {
99+
if(!is_float($value)) {
100+
if(is_numeric($value)) {
101+
$array[$key] = (float)$value;
102+
}
103+
else {
104+
throw new TypeError("Array value at key '$key' is not a float");
105+
}
106+
}
107+
}
108+
elseif($className === "string") {
109+
if(!is_string($value)) {
110+
$array[$key] = (string)$value;
111+
}
112+
}
113+
elseif($className === "bool" || $className === "boolean") {
114+
if(!is_bool($value)) {
115+
$array[$key] = (bool)$value;
116+
}
117+
}
118+
else {
119+
if(!$value instanceof $className) {
120+
throw new TypeError("Array value at key '$key' is not an instance of $className");
121+
}
122+
}
123+
}
124+
125+
return $array;
126+
}
127+
76128
/**
77129
* @template T
78130
* @param class-string<T> $className

test/phpunit/CacheTest.php

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
use Gt\FileCache\Cache;
55
use Gt\FileCache\FileAccess;
66
use PHPUnit\Framework\TestCase;
7+
use SplFileInfo;
8+
use SplFixedArray;
79
use stdClass;
10+
use TypeError;
811

912
class CacheTest extends TestCase {
1013
public function tearDown():void {
@@ -105,12 +108,94 @@ public function testGetArray():void {
105108
self::assertSame($value, $sut->getArray("numbers", fn() => []));
106109
}
107110

111+
public function testGetTypedArray_int():void {
112+
$value = [1, "2", 3.000];
113+
$sut = $this->getSut([
114+
"numbers" => $value,
115+
]);
116+
$typedArray = $sut->getTypedArray("numbers", "int", fn() => []);
117+
foreach($typedArray as $value) {
118+
self::assertIsInt($value);
119+
}
120+
}
121+
122+
public function testGetTypedArray_intFailure():void {
123+
$value = [1, "2", 3.000, "four"];
124+
$sut = $this->getSut([
125+
"numbers" => $value,
126+
]);
127+
self::expectException(TypeError::class);
128+
$sut->getTypedArray("numbers", "int", fn() => []);
129+
}
130+
131+
public function testGetTypedArray_float():void {
132+
$value = [1, "2", 3.000];
133+
$sut = $this->getSut([
134+
"numbers" => $value,
135+
]);
136+
$typedArray = $sut->getTypedArray("numbers", "float", fn() => []);
137+
foreach($typedArray as $value) {
138+
self::assertIsFloat($value);
139+
}
140+
}
141+
142+
public function testGetTypedArray_floatFailure():void {
143+
$value = [1, "2", 3.000, "four"];
144+
$sut = $this->getSut([
145+
"numbers" => $value,
146+
]);
147+
self::expectException(TypeError::class);
148+
$sut->getTypedArray("numbers", "float", fn() => []);
149+
}
150+
151+
public function testGetTypedArray_string():void {
152+
$value = [1, "2", 3.000, "four"];
153+
$sut = $this->getSut([
154+
"numbers" => $value,
155+
]);
156+
$typedArray= $sut->getTypedArray("numbers", "string", fn() => []);
157+
foreach($typedArray as $value) {
158+
self::assertIsString($value);
159+
}
160+
}
161+
162+
public function testGetTypedArray_bool():void {
163+
$value = [0, "1", false, true, [], new StdClass()];
164+
$sut = $this->getSut([
165+
"booleans" => $value,
166+
]);
167+
$typedArray= $sut->getTypedArray("booleans", "bool", fn() => []);
168+
foreach($typedArray as $i => $value) {
169+
self::assertSame((bool)($i % 2), $value, $i);
170+
}
171+
}
172+
173+
public function testGetTypedArray_class():void {
174+
$value = [new SplFileInfo(__FILE__), new SplFileInfo(__DIR__)];
175+
$sut = $this->getSut([
176+
"files" => $value,
177+
]);
178+
$typedArray= $sut->getTypedArray("files", SplFileInfo::class, fn() => []);
179+
foreach($typedArray as $value) {
180+
self::assertInstanceOf(SplFileInfo::class, $value);
181+
}
182+
}
183+
184+
public function testGetTypedArray_classError():void {
185+
$value = [new SplFileInfo(__FILE__), new SplFixedArray(), new SplFileInfo(__DIR__)];
186+
$sut = $this->getSut([
187+
"files" => $value,
188+
]);
189+
self::expectException(TypeError::class);
190+
$sut->getTypedArray("files", SplFileInfo::class, fn() => []);
191+
}
192+
108193
public function testGetArray_notArray():void {
109194
$value = (object)[1, 2, 3];
110195
$sut = $this->getSut([
111196
"numbers" => $value,
112197
]);
113-
self::expectException(\TypeError::class);
198+
self::expectException(TypeError::class);
114199
self::expectExceptionMessage("Value with key 'numbers' is not an array");
115200
$sut->getArray("numbers", fn() => []);
116201
}

0 commit comments

Comments
 (0)