/** * The Constructor. * * @param object|string $reference An instance or a fully-namespaced class name. */ public function __construct($reference, $static = false) { $this->_reference = $reference; if (is_object($reference)) { Suite::register(get_class($reference)); } Suite::register(Suite::hash($reference)); }
/** * Constructor * * @param string|object $actual A fully-namespaced class name or an object instance. * @param string $expected The expected method method name to be called. */ public function __construct($actual) { $actual = ltrim($actual, '\\'); $this->_actual = $actual; Suite::register(Suite::hash($actual)); $this->_message = new Message(['name' => $actual]); $this->_backtrace = Debugger::backtrace(); }
/** * Stubs a method. * * @param string $name Method name or array of stubs where key are method names and * values the stubs. * @param string $closure The stub implementation. * @return object The subbed method instance. */ public function method($name, $closure = null) { $static = false; $reference = $this->_reference; if (preg_match('/^::.*/', $name)) { $static = true; $reference = is_object($reference) ? get_class($reference) : $reference; $name = substr($name, 2); } $hash = Suite::hash($reference); if (!isset(static::$_registered[$hash])) { static::$_registered[$hash] = new static($reference); } $instance = static::$_registered[$hash]; if (is_object($reference)) { Suite::register(get_class($reference)); } else { Suite::register($reference); } if (!isset($instance->_stubs[$name])) { $instance->_stubs[$name] = []; } $method = new Method(compact('name', 'static', 'closure')); array_unshift($instance->_stubs[$name], $method); return $method; }
Suite::register($hash); expect(Suite::registered($hash))->toBe(true); }); }); describe("::register()", function () { it("return `false` if the hash is not registered", function () { $instance = new stdClass(); $hash = Suite::hash($instance); expect(Suite::registered($hash))->toBe(false); }); }); describe("::reset()", function () { it("clears registered hashes", function () { $instance = new stdClass(); $hash = Suite::hash($instance); Suite::register($hash); expect(Suite::registered($hash))->toBe(true); Suite::reset(); expect(Suite::registered($hash))->toBe(false); }); }); describe("->status()", function () { it("returns `0` if a specs suite passes", function () { $describe = $this->suite->describe("", function () { $this->it("passes", function () { $this->expect(true)->toBe(true); }); }); $this->suite->run(); expect($this->suite->status())->toBe(0); });
/** * Stubs a method. * * @param string $path Method name or array of stubs where key are method names and * values the stubs. * @param string $closure The stub implementation. * @return Method[] The created array of method instances. * @return Method The stubbed method instance. */ public function method($path, $closure = null) { if ($this->_needToBePatched) { $layer = Double::classname(); Monkey::patch($this->_reference, $layer); $this->_needToBePatched = false; $this->_reference = $layer; } $reference = $this->_reference; if (!$path) { throw new InvalidArgumentException("Method name can't be empty."); } $names = is_array($path) ? $path : [$path]; $this->_chain = []; $total = count($names); foreach ($names as $index => $name) { if (preg_match('/^::.*/', $name)) { $reference = is_object($reference) ? get_class($reference) : $reference; } $hash = Suite::hash($reference); if (!isset(static::$_registered[$hash])) { static::$_registered[$hash] = new static($reference); } $instance = static::$_registered[$hash]; if (is_object($reference)) { Suite::register(get_class($reference)); } else { Suite::register($reference); } if (!isset($instance->_methods[$name])) { $instance->_methods[$name] = []; $instance->_stubs[$name] = Double::instance(); } $method = new Method(['parent' => $this, 'reference' => $reference, 'name' => $name]); $this->_chain[$name] = $method; array_unshift($instance->_methods[$name], $method); if ($index < $total - 1) { $reference = $instance->_stubs[$name]; $method->andReturn($instance->_stubs[$name]); } } $method = end($this->_chain); if ($closure) { $method->andRun($closure); } return $method; }
/** * Watch a message. * * @param string|object $actual A fully-namespaced class name or an object instance. * @param string $method The expected method method name to be called. * @param object A message instance. */ protected function _watch($message) { $reference = $message->reference(); if (!$reference) { Suite::register($message->name()); return $message; } if (is_object($reference)) { Suite::register(get_class($reference)); } Suite::register(Suite::hash($reference)); return $message; }