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; }
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); } }
/** * @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; }