when($result = new SUT('strtoupper')) ->then ->string($result('foo')) ->isEqualTo('FOO') ->string($result->getValidCallback()) ->isEqualTo('strtoupper') ->string($result->getHash()) ->isEqualTo('function#strtoupper') ->isEqualTo($result . '') ->object($reflection = $result->getReflection()) ->isInstanceOf('ReflectionFunction') ->string($reflection->getName()) ->isEqualTo('strtoupper'); } public function case_form_class___method() { $this ->when($result = new SUT(__CLASS__ . '::strtoupper')) ->then ->string($result('foo')) ->isEqualTo('FOO') ->array($result->getValidCallback()) ->isEqualTo([__CLASS__, 'strtoupper']) ->string($result->getHash()) ->isEqualTo('class#' . __CLASS__ . '::strtoupper') ->isEqualTo($result . '') ->object($reflection = $result->getReflection()) ->isInstanceOf('ReflectionMethod') ->string($reflection->getName()) ->isEqualTo('strtoupper'); } public function case_form_class_method() { $this ->when($result = new SUT(__CLASS__, 'strtoupper')) ->then ->string($result('foo')) ->isEqualTo('FOO') ->array($result->getValidCallback()) ->isEqualTo([__CLASS__, 'strtoupper']) ->string($result->getHash()) ->isEqualTo('class#' . __CLASS__ . '::strtoupper') ->isEqualTo($result . '') ->object($reflection = $result->getReflection()) ->isInstanceOf('ReflectionMethod') ->string($reflection->getName()) ->isEqualTo('strtoupper'); } public function case_form_object_method() { $this ->when($result = new SUT($this, 'strtolower')) ->then ->string($result('FOO')) ->isEqualTo('foo') ->array($result->getValidCallback()) ->isEqualTo([$this, 'strtolower']) ->string($result->getHash()) ->matches( '/^object\([^:]+\)#' . preg_quote(__CLASS__) . '::strtolower$/' ) ->isEqualTo($result . '') ->object($reflection = $result->getReflection()) ->isInstanceOf('ReflectionMethod') ->string($reflection->getName()) ->isEqualTo('strtolower'); } public function case_form_object_invoke() { $this ->when($result = new SUT($this)) ->then ->string($result('foo')) ->isEqualTo('FOO') ->array($result->getValidCallback()) ->isEqualTo([$this, '__invoke']) ->string($result->getHash()) ->matches( '/^object\([^:]+\)#' . preg_quote(__CLASS__) . '::__invoke$/' ) ->isEqualTo($result . '') ->object($reflection = $result->getReflection()) ->isInstanceOf('ReflectionMethod') ->string($reflection->getName()) ->isEqualTo('__invoke'); } public function case_form_closure() { $this ->given( $closure = function ($string) { return strtoupper($string); } ) ->when($result = new SUT($closure)) ->then ->string($result('foo')) ->isEqualTo('FOO') ->object($result->getValidCallback()) ->isIdenticalTo($closure) ->string($result->getHash()) ->matches('/^closure\([^:]+\)$/') ->isEqualTo($result . '') ->object($reflection = $result->getReflection()) ->isInstanceOf('ReflectionFunction') ->string($reflection->getName()) ->isEqualTo('Hoa\Consistency\Test\Unit\{closure}'); } public function case_form_array_of_class_method() { $this ->when($result = new SUT([__CLASS__, 'strtoupper'])) ->then ->string($result('foo')) ->isEqualTo('FOO') ->array($result->getValidCallback()) ->isEqualTo([__CLASS__, 'strtoupper']) ->string($result->getHash()) ->isEqualTo('class#' . __CLASS__ . '::strtoupper') ->isEqualTo($result . '') ->object($reflection = $result->getReflection()) ->isInstanceOf('ReflectionMethod') ->string($reflection->getName()) ->isEqualTo('strtoupper'); } public function case_form_array_of_object_method() { $this ->when($result = new SUT([$this, 'strtolower'])) ->then ->string($result('FOO')) ->isEqualTo('foo') ->array($result->getValidCallback()) ->isEqualTo([$this, 'strtolower']) ->string($result->getHash()) ->matches( '/^object\([^:]+\)#' . preg_quote(__CLASS__) . '::strtolower$/' ) ->isEqualTo($result . '') ->object($reflection = $result->getReflection()) ->isInstanceOf('ReflectionMethod') ->string($reflection->getName()) ->isEqualTo('strtolower'); } public function case_form_able_not_a_string() { $this ->exception(function () { new SUT(__CLASS__, 123); }) ->isInstanceOf('Hoa\Consistency\Exception'); } public function case_form_function_not_defined() { $this ->exception(function () { new SUT('__hoa_test_undefined_function__'); }) ->isInstanceOf('Hoa\Consistency\Exception'); } public function case_form_able_cannot_be_deduced() { $this ->given($this->function->method_exists = false) ->exception(function () { new SUT($this); }) ->isInstanceOf('Hoa\Consistency\Exception'); } public function case_invoke() { $this ->given( $callable = new SUT( function ($x, $y, $z) { return [$x, $y, $z]; } ) ) ->when($result = $callable(7, [4.2], 'foo')) ->then ->array($result) ->isEqualTo([7, [4.2], 'foo']); } public function case_distribute_arguments() { $this ->given( $callable = new SUT( function ($x, $y, $z) { return [$x, $y, $z]; } ) ) ->when($result = $callable->distributeArguments([7, [4.2], 'foo'])) ->then ->array($result) ->isEqualTo([7, [4.2], 'foo']); } protected function _get_valid_callback_stream_xxx($argument, $method) { $this ->given( $stream = new \Mock\Hoa\Stream\IStream\Out(), $arguments = [$argument], $xcallable = new SUT($stream) ) ->when($result = $xcallable->getValidCallback($arguments)) ->then ->array($result) ->isEqualTo([$stream, $method]); } public function case_get_valid_callback_stream_character() { return $this->_get_valid_callback_stream_xxx('f', 'writeCharacter'); } public function case_get_valid_callback_stream_string() { return $this->_get_valid_callback_stream_xxx('foo', 'writeString'); } public function case_get_valid_callback_stream_boolean() { return $this->_get_valid_callback_stream_xxx(true, 'writeBoolean'); } public function case_get_valid_callback_stream_integer() { return $this->_get_valid_callback_stream_xxx(7, 'writeInteger'); } public function case_get_valid_callback_stream_array() { return $this->_get_valid_callback_stream_xxx([4, 2], 'writeArray'); } public function case_get_valid_callback_stream_float() { return $this->_get_valid_callback_stream_xxx(4.2, 'writeFloat'); } public function case_get_valid_callback_stream_other() { return $this->_get_valid_callback_stream_xxx($this, 'writeAll'); } public static function strtoupper($string) { return strtoupper($string); } public function strtolower($string) { return strtolower($string); } public function __invoke($string) { return strtoupper($string); } public function __toString() { return 'hello'; } }