From c6173a0054ca61c2b05c1cd3d1ed6d651ce03618 Mon Sep 17 00:00:00 2001 From: mark_story Date: Thu, 10 Apr 2014 20:37:08 -0400 Subject: [PATCH] Add tests for #3288 and remove nested ternaries. Nested ternaries are complicated to maintain and hard to read. Break down the nested ternary into two conditionals. --- lib/Cake/Test/Case/Utility/HashTest.php | 33 +++++++++++++++++++++++++ lib/Cake/Utility/Hash.php | 8 +++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/lib/Cake/Test/Case/Utility/HashTest.php b/lib/Cake/Test/Case/Utility/HashTest.php index 037c6a2a7..65c1a0e39 100644 --- a/lib/Cake/Test/Case/Utility/HashTest.php +++ b/lib/Cake/Test/Case/Utility/HashTest.php @@ -831,6 +831,39 @@ class HashTest extends CakeTestCase { $this->assertEquals(5, $result[3]['id']); } +/** + * Test extracting based on attributes with boolean values. + * + * @return void + */ + public function testExtractAttributeBoolean() { + $users = array( + array( + 'id' => 2, + 'username' => 'johndoe', + 'active' => true + ), + array( + 'id' => 5, + 'username' => 'kevin', + 'active' => true + ), + array( + 'id' => 9, + 'username' => 'samantha', + 'active' => false + ), + ); + $result = Hash::extract($users, '{n}[active=false]'); + $this->assertCount(1, $result); + $this->assertEquals($users[2], $result[0]); + + $result = Hash::extract($users, '{n}[active=true]'); + $this->assertCount(2, $result); + $this->assertEquals($users[0], $result[0]); + $this->assertEquals($users[1], $result[1]); + } + /** * Test that attribute matchers don't cause errors on scalar data. * diff --git a/lib/Cake/Utility/Hash.php b/lib/Cake/Utility/Hash.php index b35cad715..fa22fe8d1 100644 --- a/lib/Cake/Utility/Hash.php +++ b/lib/Cake/Utility/Hash.php @@ -192,7 +192,13 @@ class Hash { return false; } - $prop = isset($data[$attr]) ? ( is_bool($data[$attr]) ? (($data[$attr]) ? 'true' : 'false') : $data[$attr] ) : null; + $prop = null; + if (isset($data[$attr])) { + $prop = $data[$attr]; + } + if ($prop === true || $prop === false) { + $prop = $prop ? 'true' : 'false'; + } // Pattern matches and other operators. if ($op === '=' && $val && $val[0] === '/') {