From 7257654753ad05ecee0e7ea82cadae74e5c983c5 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Sat, 22 Mar 2025 16:42:42 +0400 Subject: [PATCH] modifs.mineures sans commentaires --- src/php/access/KeyAccess.php | 31 ++++++++++++ tests/wip/php/access/KeyAccessTest.php | 65 ++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/src/php/access/KeyAccess.php b/src/php/access/KeyAccess.php index 38bfee5..79948b2 100644 --- a/src/php/access/KeyAccess.php +++ b/src/php/access/KeyAccess.php @@ -3,6 +3,7 @@ namespace nur\sery\wip\php\access; use ArrayAccess; use nulib\cl; +use nulib\ref\schema\ref_schema; /** * Class KeyAccess: accès @@ -116,4 +117,34 @@ class KeyAccess extends AbstractAccess { "protect_dest" => $this->protectDest, ]); } + + function ensureAssoc(array $keys): void { + $index = 0; + $dest =& $this->dest; + foreach ($keys as $key) { + if ($dest !== null && array_key_exists($key, $dest)) continue; + while (in_array($index, $keys, true)) { + $index++; + } + if ($dest !== null && array_key_exists($index, $dest)) { + $dest[$key] = $dest[$index]; + unset($dest[$index]); + $index++; + } + } + } + + function ensureKeys(array $defaults): void { + $dest =& $this->dest; + $keys = array_keys($defaults); + foreach ($keys as $key) { + if ($dest === null || !array_key_exists($key, $dest)) { + $dest[$key] = $defaults[$key]; + } + } + } + + function ensureOrder(array $keys): void { + $dest =& $this->dest; + } } diff --git a/tests/wip/php/access/KeyAccessTest.php b/tests/wip/php/access/KeyAccessTest.php index d71eb8e..5247d98 100644 --- a/tests/wip/php/access/KeyAccessTest.php +++ b/tests/wip/php/access/KeyAccessTest.php @@ -125,4 +125,69 @@ class KeyAccessTest extends TestCase { self::assertTrue($a->available()); self::assertSame("", $a->get($default)); } + + private function _ensureAssoc(?array $orig, ?array $expected, array $keys) { + $v = $orig; $a = new KeyAccess($v); + $a->ensureAssoc($keys); + self::assertSame($expected, $v); + } + function testEnsureAssoc() { + $keys = ["a", "b", "c"]; + + $this->_ensureAssoc(null, null, $keys); + $this->_ensureAssoc([], [], $keys); + $this->_ensureAssoc([1], ["a" => 1], $keys); + $this->_ensureAssoc([1, 2, 3], ["a" => 1, "b" => 2, "c" => 3], $keys); + $this->_ensureAssoc([1, 2, 3, 4], [3 => 4, "a" => 1, "b" => 2, "c" => 3], $keys); + $this->_ensureAssoc(["c" => 3, 1], ["c" => 3, "a" => 1], $keys); + $this->_ensureAssoc(["c" => 3, "b" => 2, 1], ["c" => 3, "b" => 2, "a" => 1], $keys); + $this->_ensureAssoc(["c" => 3, "b" => 2, "a" => 1], ["c" => 3, "b" => 2, "a" => 1], $keys); + $this->_ensureAssoc(["a" => 1, 2], ["a" => 1, "b" => 2], $keys); + $this->_ensureAssoc([2, "a" => 1], ["a" => 1, "b" => 2], $keys); + + $keys = [0, "a", "b"]; + $this->_ensureAssoc([1], [1], $keys); + $this->_ensureAssoc([1, 2], [1, "a" => 2], $keys); + } + + private function _ensureKeys(?array $orig, ?array $expected, array $defaults) { + $v = $orig; $a = new KeyAccess($v); + $a->ensureKeys($defaults); + self::assertSame($expected, $v); + } + function testEnsureKeys() { + $defaults = ["a" => false, "b" => false, "c" => false]; + + $this->_ensureKeys(null, ["a" => false, "b" => false, "c" => false], $defaults); + $this->_ensureKeys([], ["a" => false, "b" => false, "c" => false], $defaults); + $this->_ensureKeys(["a" => 1], ["a" => 1, "b" => false, "c" => false], $defaults); + $this->_ensureKeys(["a" => 1, "b" => 2, "c" => 3], ["a" => 1, "b" => 2, "c" => 3], $defaults); + $this->_ensureKeys(["x"], ["x", "a" => false, "b" => false, "c" => false], $defaults); + $this->_ensureKeys(["x", "a" => 1], ["x", "a" => 1, "b" => false, "c" => false], $defaults); + $this->_ensureKeys(["a" => 1, "x"], ["a" => 1, "x", "b" => false, "c" => false], $defaults); + $this->_ensureKeys(["a" => 1, "b" => 2, "c" => 3, "x"], ["a" => 1, "b" => 2, "c" => 3, "x"], $defaults); + } + + private function _ensureAssocKeysOrder(?array $orig, ?array $expected, array $defaults) { + $v = $orig; $a = new KeyAccess($v); + $keys = array_keys($defaults); + $a->ensureAssoc($keys); + $a->ensureKeys($defaults); + $a->ensureOrder($keys); + self::assertSame($expected, $v); + } + function testEnsureAssocKeysOrder() { + $defaults = ["a" => false, "b" => false, "c" => false]; + + $this->_ensureAssocKeysOrder(null, ["a" => false, "b" => false, "c" => false], $defaults); + $this->_ensureAssocKeysOrder([], ["a" => false, "b" => false, "c" => false], $defaults); + $this->_ensureAssocKeysOrder([1], ["a" => 1, "b" => false, "c" => false], $defaults); + $this->_ensureAssocKeysOrder([1, 2, 3], ["a" => 1, "b" => 2, "c" => 3], $defaults); + $this->_ensureAssocKeysOrder([1, 2, 3, 4], [3 => 4, "a" => 1, "b" => 2, "c" => 3], $defaults); + $this->_ensureAssocKeysOrder(["c" => 3, 1], ["c" => 3, "a" => 1, "b" => false], $defaults); + $this->_ensureAssocKeysOrder(["c" => 3, "b" => 2, 1], ["c" => 3, "b" => 2, "a" => 1], $defaults); + $this->_ensureAssocKeysOrder(["c" => 3, "b" => 2, "a" => 1], ["c" => 3, "b" => 2, "a" => 1], $defaults); + $this->_ensureAssocKeysOrder(["a" => 1, 2], ["a" => 1, "b" => 2, "c" => false], $defaults); + $this->_ensureAssocKeysOrder([2, "a" => 1], ["a" => 1, "b" => 2, "c" => false], $defaults); + } }