exists()); self::assertFalse($a->available()); self::assertSame($default, $a->get($default)); $i = false; $a = new KeyAccess($i); self::assertTrue($a->exists()); self::assertTrue($a->available()); self::assertSame(false, $a->get($default)); $i = ""; $a = new KeyAccess($i); self::assertTrue($a->exists()); self::assertTrue($a->available()); self::assertSame("", $a->get($default)); # $i = null; $a = new KeyAccess($i, null, ["allow_null" => false]); self::assertFalse($a->exists()); self::assertFalse($a->available()); self::assertSame($default, $a->get($default)); $i = null; $a = new KeyAccess($i, null, ["allow_null" => true]); self::assertTrue($a->exists()); self::assertTrue($a->available()); self::assertSame(null, $a->get($default)); # $i = false; $a = new KeyAccess($i, null, ["allow_false" => false]); self::assertTrue($a->exists()); self::assertFalse($a->available()); self::assertSame($default, $a->get($default)); $i = false; $a = new KeyAccess($i, null, ["allow_false" => true]); self::assertTrue($a->exists()); self::assertTrue($a->available()); self::assertSame(false, $a->get($default)); # $i = ""; $a = new KeyAccess($i, null, ["allow_empty" => false]); self::assertTrue($a->exists()); self::assertFalse($a->available()); self::assertSame($default, $a->get($default)); $i = ""; $a = new KeyAccess($i, null, ["allow_empty" => true]); self::assertTrue($a->exists()); self::assertTrue($a->available()); self::assertSame("", $a->get($default)); } function testArrayAccess() { $default = new stdClass(); $array = ["null" => null, "false" => false, "empty" => ""]; # $a = new KeyAccess($array, "inexistant"); self::assertFalse($a->exists()); self::assertFalse($a->available()); self::assertSame($default, $a->get($default)); $a = new KeyAccess($array, "null"); self::assertTrue($a->exists()); self::assertTrue($a->available()); self::assertSame(null, $a->get($default)); $a = new KeyAccess($array, "false"); self::assertTrue($a->exists()); self::assertFalse($a->available()); self::assertSame($default, $a->get($default)); $a = new KeyAccess($array, "empty"); self::assertTrue($a->exists()); self::assertTrue($a->available()); self::assertSame("", $a->get($default)); # $a = new KeyAccess($array, "null", ["allow_null" => false]); self::assertTrue($a->exists()); self::assertFalse($a->available()); self::assertSame($default, $a->get($default)); $a = new KeyAccess($array, "null", ["allow_null" => true]); self::assertTrue($a->exists()); self::assertTrue($a->available()); self::assertSame(null, $a->get($default)); # $a = new KeyAccess($array, "false", ["allow_false" => false]); self::assertTrue($a->exists()); self::assertFalse($a->available()); self::assertSame($default, $a->get($default)); $a = new KeyAccess($array, "false", ["allow_false" => true]); self::assertTrue($a->exists()); self::assertTrue($a->available()); self::assertSame(false, $a->get($default)); # $a = new KeyAccess($array, "empty", ["allow_empty" => false]); self::assertTrue($a->exists()); self::assertFalse($a->available()); self::assertSame($default, $a->get($default)); $a = new KeyAccess($array, "empty", ["allow_empty" => true]); self::assertTrue($a->exists()); 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); } }