Example #1
0
 /**
  * Resolves a class member, which is either a field, a class constant
  * or the `ClassName::class` syntax, which returns the class' literal.
  *
  * @param  lang.XPClass $class
  * @param  var[] $token A token as returned by `token_get_all()`
  * @param  string $context
  * @return var
  */
 protected function memberOf($class, $token, $context)
 {
     if (T_VARIABLE === $token[0]) {
         $field = $class->getField(substr($token[1], 1));
         $m = $field->getModifiers();
         if ($m & MODIFIER_PUBLIC) {
             return $field->get(null);
         } else {
             if ($m & MODIFIER_PROTECTED && $class->isAssignableFrom($context)) {
                 return $field->setAccessible(true)->get(null);
             } else {
                 if ($m & MODIFIER_PRIVATE && $class->getName() === $context) {
                     return $field->setAccessible(true)->get(null);
                 } else {
                     throw new IllegalAccessException(sprintf('Cannot access %s field %s::$%s', implode(' ', Modifiers::namesOf($m)), $class->getName(), $field->getName()));
                 }
             }
         }
     } else {
         if (T_CLASS === $token[0]) {
             return $class->literal();
         } else {
             return $class->getConstant($token[1]);
         }
     }
 }
Example #2
0
 /**
  * Creates a new instance binding
  *
  * @param  lang.XPClass $class
  * @param  lang.XPClass $type
  * @throws lang.IllegalArgumentException
  */
 public function __construct($class, $type = null)
 {
     if ($type && !$type->isAssignableFrom($class)) {
         throw new IllegalArgumentException($class . ' is not an instance of ' . $type);
     } else {
         if ($class->isInterface() || $class->getModifiers() & MODIFIER_ABSTRACT) {
             throw new IllegalArgumentException('Cannot bind to non-concrete type ' . $type);
         }
     }
     $this->class = $class;
 }
 /**
  * Creates an instance from a testcase
  *
  * @param  lang.XPClass $class
  * @param  var[] $args
  * @throws lang.IllegalArgumentException in case given argument is not a testcase class
  * @throws lang.IllegalStateException in case a test method is overridden
  * @throws util.NoSuchElementException in case given testcase class does not contain any tests
  */
 public function __construct($class, $arguments)
 {
     if (!$class->isSubclassOf(self::$base)) {
         throw new IllegalArgumentException('Given argument is not a TestCase class (' . \xp::stringOf($class) . ')');
     }
     foreach ($class->getMethods() as $method) {
         if ($method->hasAnnotation('test')) {
             $name = $method->getName();
             if (self::$base->hasMethod($name)) {
                 throw $this->cannotOverride($method);
             }
             $this->testMethods[] = $name;
         }
     }
     if (empty($this->testMethods)) {
         throw new NoSuchElementException('No tests found in ' . $class->getName());
     }
     $this->class = $class;
     $this->arguments = (array) $arguments;
 }
Example #4
0
 /**
  * Helper method for isInstance() and isAssignableFrom()
  *
  * @param  lang.XPClass $class
  * @return bool
  */
 protected function assignableFromClass($class)
 {
     if ($class->isGeneric() && $this->base->isAssignableFrom($class->genericDefinition())) {
         foreach ($class->genericArguments() as $pos => $arg) {
             if (!$this->components[$pos]->isAssignableFrom($arg)) {
                 return false;
             }
         }
         return true;
     }
     return false;
 }
Example #5
0
 /**
  * Return name of a given class - shortened if inside a registered package
  *
  * @param  lang.XPClass $class
  * @return string
  */
 public static function nameOf($class)
 {
     if (isset(self::$packages[$class->getPackage()->getName()])) {
         return $class->getSimpleName();
     } else {
         return $class->getName();
     }
 }
Example #6
0
 /**
  * Assertion helper
  *
  * @param  string[] $expected
  * @param  lang.XPClass $type
  * @return void
  * @throws unittest.AssertionFailedError
  */
 protected function assertDeclaresMethods($expected, $type)
 {
     $this->assertEquals($expected, array_map(function ($method) {
         return $method->toString();
     }, $type->getDeclaredMethods()));
 }