public function autoload($className)
 {
     static $checkMethods = array('class_exists', 'interface_exists', 'trait_exists');
     AutoloaderPool::autoloadWithRecache($className);
     if (class_exists($className, false)) {
         return;
     }
     foreach (debug_backtrace() as $call) {
         if (!empty($call['function']) && empty($call['class']) && in_array($call['function'], $checkMethods)) {
             return;
         }
     }
     throw new ClassNotFoundException('"' . $className . '"');
 }
コード例 #2
0
 public static function suite()
 {
     $suite = new TestSuite('onPHP-' . ONPHP_VERSION);
     // meta, DB and DAOs ordered tests portion
     if (self::$dbs) {
         try {
             /**
              * @todo fail - constructor with argument, but static method 'me' - without
              */
             Singleton::getInstance('DBTestPool', self::$dbs)->connect();
         } catch (Exception $e) {
             Singleton::dropInstance('DBTestPool');
             Singleton::getInstance('DBTestPool');
         }
         // build stuff from meta
         $metaDir = ONPHP_TEST_PATH . 'meta' . DIRECTORY_SEPARATOR;
         $path = ONPHP_META_PATH . 'bin' . DIRECTORY_SEPARATOR . 'build.php';
         $_SERVER['argv'] = array();
         $_SERVER['argv'][0] = $path;
         $_SERVER['argv'][1] = $metaDir . 'config.inc.php';
         $_SERVER['argv'][2] = $metaDir . 'config.meta.xml';
         $_SERVER['argv'][] = '--force';
         $_SERVER['argv'][] = '--no-schema-check';
         $_SERVER['argv'][] = '--drop-stale-files';
         include $path;
         AutoloaderPool::get('onPHP')->addPaths(array(ONPHP_META_AUTO_BUSINESS_DIR, ONPHP_META_AUTO_DAO_DIR, ONPHP_META_AUTO_PROTO_DIR, ONPHP_META_DAO_DIR, ONPHP_META_BUSINESS_DIR, ONPHP_META_PROTO_DIR));
         $dBCreator = DBTestCreator::create()->setSchemaPath(ONPHP_META_AUTO_DIR . 'schema.php')->setTestPool(DBTestPool::me());
         $out = MetaConfiguration::me()->getOutput();
         foreach (DBTestPool::me()->getPool() as $connector => $db) {
             DBPool::me()->setDefault($db);
             $out->info('Using ')->info(get_class($db), true)->infoLine(' connector.');
             $dBCreator->dropDB(true);
             $dBCreator->createDB()->fillDB();
             MetaConfiguration::me()->checkIntegrity();
             $out->newLine();
             $dBCreator->dropDB();
         }
         DBPool::me()->dropDefault();
     }
     foreach (self::$paths as $testPath) {
         foreach (glob($testPath . '*Test' . EXT_CLASS, GLOB_BRACE) as $file) {
             $suite->addTestFile($file);
         }
     }
     return $suite;
 }
コード例 #3
0
function init()
{
    define('ONPHP_META_BUILDERS', ONPHP_META_PATH . 'builders' . DIRECTORY_SEPARATOR);
    define('ONPHP_META_PATTERNS', ONPHP_META_PATH . 'patterns' . DIRECTORY_SEPARATOR);
    define('ONPHP_META_TYPES', ONPHP_META_PATH . 'types' . DIRECTORY_SEPARATOR);
    AutoloaderPool::get('onPHP')->addPaths(array(ONPHP_META_BUILDERS, ONPHP_META_PATTERNS, ONPHP_META_TYPES));
    Assert::isTrue(defined('PATH_CLASSES'), 'constant PATH_CLASSES must be defined');
    if (!defined('ONPHP_META_DAO_DIR')) {
        define('ONPHP_META_DAO_DIR', PATH_CLASSES . 'DAOs' . DIRECTORY_SEPARATOR);
    }
    if (!defined('ONPHP_META_BUSINESS_DIR')) {
        define('ONPHP_META_BUSINESS_DIR', PATH_CLASSES . 'Business' . DIRECTORY_SEPARATOR);
    }
    if (!defined('ONPHP_META_PROTO_DIR')) {
        define('ONPHP_META_PROTO_DIR', PATH_CLASSES . 'Proto' . DIRECTORY_SEPARATOR);
    }
    define('ONPHP_META_AUTO_DIR', PATH_CLASSES . 'Auto' . DIRECTORY_SEPARATOR);
    if (!defined('ONPHP_META_AUTO_BUSINESS_DIR')) {
        define('ONPHP_META_AUTO_BUSINESS_DIR', ONPHP_META_AUTO_DIR . 'Business' . DIRECTORY_SEPARATOR);
    }
    define('ONPHP_META_AUTO_PROTO_DIR', ONPHP_META_AUTO_DIR . 'Proto' . DIRECTORY_SEPARATOR);
    if (!defined('ONPHP_META_AUTO_DAO_DIR')) {
        define('ONPHP_META_AUTO_DAO_DIR', ONPHP_META_AUTO_DIR . 'DAOs' . DIRECTORY_SEPARATOR);
    }
    if (!is_dir(ONPHP_META_DAO_DIR)) {
        mkdir(ONPHP_META_DAO_DIR, 0755, true);
    }
    if (!is_dir(ONPHP_META_AUTO_DIR)) {
        mkdir(ONPHP_META_AUTO_DIR, 0755, true);
    }
    if (!is_dir(ONPHP_META_AUTO_BUSINESS_DIR)) {
        mkdir(ONPHP_META_AUTO_BUSINESS_DIR, 0755);
    }
    if (!is_dir(ONPHP_META_AUTO_PROTO_DIR)) {
        mkdir(ONPHP_META_AUTO_PROTO_DIR, 0755);
    }
    if (!is_dir(ONPHP_META_AUTO_DAO_DIR)) {
        mkdir(ONPHP_META_AUTO_DAO_DIR, 0755);
    }
    if (!is_dir(ONPHP_META_BUSINESS_DIR)) {
        mkdir(ONPHP_META_BUSINESS_DIR, 0755, true);
    }
    if (!is_dir(ONPHP_META_PROTO_DIR)) {
        mkdir(ONPHP_META_PROTO_DIR, 0755, true);
    }
}
コード例 #4
0
 /**
  * @return MetaConfiguration
  **/
 public function checkIntegrity()
 {
     $out = $this->getOutput()->newLine()->infoLine('Checking sanity of generated files: ')->newLine();
     AutoloaderPool::get('onPHP')->addPaths(array(ONPHP_META_BUSINESS_DIR, ONPHP_META_DAO_DIR, ONPHP_META_PROTO_DIR, ONPHP_META_AUTO_BUSINESS_DIR, ONPHP_META_AUTO_DAO_DIR, ONPHP_META_AUTO_PROTO_DIR));
     $out->info("\t");
     $formErrors = array();
     foreach ($this->classes as $name => $class) {
         if (!($class->getPattern() instanceof SpookedClassPattern || $class->getPattern() instanceof SpookedEnumerationPattern || $class->getPattern() instanceof SpookedEnumPattern || $class->getPattern() instanceof InternalClassPattern) && class_exists($class->getName(), true)) {
             $out->info($name, true);
             $info = new ReflectionClass($name);
             $this->checkClassSanity($class, $info);
             if ($info->implementsInterface('Prototyped')) {
                 $this->checkClassSanity($class, new ReflectionClass('Proto' . $name));
             }
             if ($info->implementsInterface('DAOConnected')) {
                 $this->checkClassSanity($class, new ReflectionClass($name . 'DAO'));
             }
             foreach ($class->getInterfaces() as $interface) {
                 Assert::isTrue($info->implementsInterface($interface), 'class ' . $class->getName() . ' expected to implement interface ' . $interface);
             }
             // special handling for Enumeration instances
             if ($class->getPattern() instanceof EnumerationClassPattern || $class->getPattern() instanceof EnumClassPattern) {
                 $object = new $name(call_user_func(array($name, 'getAnyId')));
                 Assert::isTrue(unserialize(serialize($object)) == $object);
                 $out->info(', ');
                 if ($this->checkEnumerationRefIntegrity) {
                     if ($object instanceof Enumeration || $object instanceof Enum) {
                         $this->checkEnumerationReferentialIntegrity($object, $class->getTableName());
                     }
                 }
                 continue;
             }
             if ($class->getPattern() instanceof AbstractClassPattern) {
                 $out->info(', ');
                 continue;
             }
             $object = new $name();
             $proto = $object->proto();
             $form = $proto->makeForm();
             foreach ($class->getProperties() as $name => $property) {
                 Assert::isTrue($property->toLightProperty($class) == $proto->getPropertyByName($name), 'defined property does not match autogenerated one - ' . $class->getName() . '::' . $property->getName());
             }
             if (!$object instanceof DAOConnected) {
                 $out->info(', ');
                 continue;
             }
             $dao = $object->dao();
             Assert::isEqual($dao->getIdName(), $class->getIdentifier()->getColumnName(), 'identifier name mismatch in ' . $class->getName() . ' class');
             try {
                 DBPool::getByDao($dao);
             } catch (MissingElementException $e) {
                 // skipping
                 $out->info(', ');
                 continue;
             }
             $query = Criteria::create($dao)->setLimit(1)->add(Expression::notNull($class->getIdentifier()->getName()))->addOrder($class->getIdentifier()->getName())->toSelectQuery();
             $out->warning(' (' . $query->getFieldsCount() . '/' . $query->getTablesCount() . '/');
             $clone = clone $object;
             if (serialize($clone) == serialize($object)) {
                 $out->info('C', true);
             } else {
                 $out->error('C', true);
             }
             $out->warning('/');
             try {
                 $object = $dao->getByQuery($query);
                 $form = $object->proto()->makeForm();
                 FormUtils::object2form($object, $form);
                 if ($errors = $form->getErrors()) {
                     $formErrors[$class->getName()] = $errors;
                     $out->error('F', true);
                 } else {
                     $out->info('F', true);
                 }
             } catch (ObjectNotFoundException $e) {
                 $out->warning('F');
             }
             $out->warning('/');
             if (Criteria::create($dao)->setFetchStrategy(FetchStrategy::cascade())->toSelectQuery() == $dao->makeSelectHead()) {
                 $out->info('H', true);
             } else {
                 $out->error('H', true);
             }
             $out->warning('/');
             // cloning once again
             $clone = clone $object;
             FormUtils::object2form($object, $form);
             FormUtils::form2object($form, $object);
             if ($object != $clone) {
                 $out->error('T', true);
             } else {
                 $out->info('T', true);
             }
             $out->warning(')')->info(', ');
         }
     }
     $out->infoLine('done.');
     if ($formErrors) {
         $out->newLine()->errorLine('Errors found:')->newLine();
         foreach ($formErrors as $class => $errors) {
             $out->errorLine("\t" . $class . ':', true);
             foreach ($errors as $name => $error) {
                 $out->errorLine("\t\t" . $name . ' - ' . ($error == Form::WRONG ? ' wrong' : ' missing'));
             }
             $out->newLine();
         }
     }
     return $this;
 }