From 4dbd8e67919d00d864d3181ca2e7e7a7b1df5afd Mon Sep 17 00:00:00 2001 From: gwoo Date: Wed, 17 Dec 2008 21:33:11 +0000 Subject: [PATCH] updating to Set::extract() to fix containable test fails, added set cases to match usage in containable.test git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@7934 3807eeeb-6ff5-0310-8944-8be069107fe0 --- cake/libs/set.php | 25 ++++++++++++++-- cake/tests/cases/libs/set.test.php | 46 +++++++++++++++++++++++++++--- 2 files changed, 64 insertions(+), 7 deletions(-) diff --git a/cake/libs/set.php b/cake/libs/set.php index e2ebf8d7c..21ce80de9 100644 --- a/cake/libs/set.php +++ b/cake/libs/set.php @@ -434,10 +434,29 @@ class Set extends Object { $items = array($items); } } - foreach ($items as $item) { + + foreach ($items as $key => $item) { + $ctext = array($context['key']); + if (!is_numeric($key)) { + $ctext[] = $token; + $token = array_shift($tokens); + if (isset($items[$token])) { + $ctext[] = $token; + $item = $items[$token]; + $matches[] = array( + 'trace' => array_merge($context['trace'], $ctext), + 'key' => $key, + 'item' => $item, + ); + break; + } + } else { + $key = $token; + } + $matches[] = array( - 'trace' => array_merge($context['trace'], array($context['key'])), - 'key' => $token, + 'trace' => array_merge($context['trace'], $ctext), + 'key' => $key, 'item' => $item, ); } diff --git a/cake/tests/cases/libs/set.test.php b/cake/tests/cases/libs/set.test.php index 7a4e742dd..041bcf883 100644 --- a/cake/tests/cases/libs/set.test.php +++ b/cake/tests/cases/libs/set.test.php @@ -403,7 +403,7 @@ class SetTest extends CakeTestCase { ), array('a' => array('II' => array('a' => 3, 'III' => array('a' => array('foo' => 4))))), ); - + $nonSequential = array( 'User' => array( 0 => array('id' => 1), @@ -413,7 +413,7 @@ class SetTest extends CakeTestCase { 3 => array('id' => 5), ), ); - + $nonZero = array( 'User' => array( 2 => array('id' => 1), @@ -423,7 +423,7 @@ class SetTest extends CakeTestCase { 3 => array('id' => 5), ), ); - + $expected = array(array('a' => $c[2]['a'])); $r = Set::extract('/a/II[a=3]/..', $c); $this->assertEqual($r, $expected); @@ -892,6 +892,44 @@ class SetTest extends CakeTestCase { $this->assertTrue(Set::matches('/Article[id=2]', $a)); $this->assertFalse(Set::matches('/Article[id=4]', $a)); $this->assertTrue(Set::matches(array(), $a)); + + $r = array( + 'Attachment' => array( + 'keep' => array() + ), + 'Comment' => array( + 'keep' => array( + 'Attachment' => array( + 'fields' => array( + 0 => 'attachment', + ), + ), + ) + ), + 'User' => array( + 'keep' => array() + ), + 'Article' => array( + 'keep' => array( + 'Comment' => array( + 'fields' => array( + 0 => 'comment', + 1 => 'published', + ), + ), + 'User' => array( + 'fields' => array( + 0 => 'user', + ), + ), + ) + ) + ); + + $this->assertTrue(Set::matches('/Article/keep/Comment', $r)); + $this->assertEqual(Set::extract('/Article/keep/Comment/fields', $r), array('comment', 'published')); + $this->assertEqual(Set::extract('/Article/keep/User/fields', $r), array('user')); + } /** * testClassicExtract method @@ -1604,7 +1642,7 @@ class SetTest extends CakeTestCase { ksort($result); ksort($expected); - + $this->assertIdentical($result, $expected); $class = new stdClass;