Skip to content

Commit 7d72534

Browse files
committed
fix(cast): correct boolify function to handle string conversions properly
1 parent 550662c commit 7d72534

2 files changed

Lines changed: 78 additions & 12 deletions

File tree

src/_/cast.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Stringable;
88

99
use function function_exists;
10+
use function in_array;
1011
use function is_array;
1112
use function is_bool;
1213
use function is_float;
@@ -17,6 +18,7 @@
1718
use function is_string;
1819
use function method_exists;
1920
use function sprintf;
21+
use function strtolower;
2022

2123
if (! function_exists(__NAMESPACE__ . '\arrayify')) {
2224
/**
@@ -96,11 +98,26 @@ function floatify(mixed $value, float $default = 0.0): float
9698
if (! function_exists(__NAMESPACE__ . '\boolify')) {
9799
function boolify(mixed $value, bool $default = false): bool
98100
{
101+
$positive = [
102+
'1',
103+
'true',
104+
'on',
105+
'yes',
106+
'y',
107+
];
108+
$negative = [
109+
'0',
110+
'false',
111+
'off',
112+
'no',
113+
'n',
114+
'',
115+
];
99116
return match (true) {
100117
is_bool($value) => $value,
101118
is_numeric($value) => (bool) $value,
102-
is_string($value) && ($value === 'true' || $value === '1') => true,
103-
is_string($value) && ($value === 'false' || $value === '1') => false,
119+
is_string($value) && in_array(strtolower($value), $positive, true) => true,
120+
is_string($value) && in_array(strtolower($value), $negative, true) => false,
104121
default => $default,
105122
};
106123
}

tests/_/CastFunctionsTest.php

Lines changed: 59 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,17 +64,49 @@ public function testToIntReturnsDefaultWhenValueIsNotInt(): void
6464

6565
public function testToBoolReturnsBoolWhenValueIsBool(): void
6666
{
67-
$value = true;
68-
$result = boolify($value);
69-
$this->assertEquals($value, $result);
67+
$result = boolify(true);
68+
$this->assertTrue($result);
7069
}
7170

7271
public function testToBoolReturnsDefaultWhenValueIsNotBool(): void
7372
{
7473
$value = 'not a bool';
75-
$default = true;
76-
$result = boolify($value, $default);
77-
$this->assertEquals(true, $result);
74+
$result = boolify($value, true);
75+
$this->assertTrue($result);
76+
}
77+
78+
public function testBoolifyParsesStringPositives(): void
79+
{
80+
$this->assertTrue(boolify('1'));
81+
$this->assertTrue(boolify('true'));
82+
$this->assertTrue(boolify('TRUE'));
83+
$this->assertTrue(boolify('on'));
84+
$this->assertTrue(boolify('ON'));
85+
$this->assertTrue(boolify('yes'));
86+
$this->assertTrue(boolify('Y'));
87+
$this->assertTrue(boolify('yEs'));
88+
}
89+
90+
public function testBoolifyParsesStringNegatives(): void
91+
{
92+
$this->assertFalse(boolify('0'));
93+
$this->assertFalse(boolify('false'));
94+
$this->assertFalse(boolify('FALSE'));
95+
$this->assertFalse(boolify('off'));
96+
$this->assertFalse(boolify('OFF'));
97+
$this->assertFalse(boolify('no'));
98+
$this->assertFalse(boolify('n'));
99+
$this->assertFalse(boolify(''));
100+
}
101+
102+
public function testBoolifyHandlesNumericValues(): void
103+
{
104+
$this->assertTrue(boolify(1));
105+
$this->assertFalse(boolify(0));
106+
$this->assertTrue(boolify(10));
107+
$this->assertTrue(boolify(-3));
108+
$this->assertTrue(boolify('2'));
109+
$this->assertFalse(boolify('0'));
78110
}
79111

80112
public function testFloatifyReturnsFloatWhenValueIsFloat(): void
@@ -113,21 +145,38 @@ public function testMapifyConvertsObjectToArray(): void
113145
$object->name = 'John';
114146
$object->age = 30;
115147
$result = mapify($object);
116-
$this->assertEquals(['name' => 'John', 'age' => 30], $result);
148+
$this->assertEquals(
149+
[
150+
'name' => 'John',
151+
'age' => 30,
152+
],
153+
$result
154+
);
117155
}
118156

119157
public function testMapifyReturnsArrayWhenValueIsArray(): void
120158
{
121-
$array = ['key' => 'value', 'number' => 42];
159+
$array = [
160+
'key' => 'value',
161+
'number' => 42,
162+
];
122163
$result = mapify($array);
123164
$this->assertEquals($array, $result);
124165
}
125166

126167
public function testMapifyHandlesNumericKeys(): void
127168
{
128-
$array = [0 => 'first', 1 => 'second', 'name' => 'test'];
169+
$array = [
170+
0 => 'first',
171+
1 => 'second',
172+
'name' => 'test',
173+
];
129174
$result = mapify($array);
130-
$expected = ['key_0' => 'first', 'key_1' => 'second', 'name' => 'test'];
175+
$expected = [
176+
'key_0' => 'first',
177+
'key_1' => 'second',
178+
'name' => 'test',
179+
];
131180
$this->assertEquals($expected, $result);
132181
}
133182

0 commit comments

Comments
 (0)