public function testConfigs()
 {
     $configPaths = glob(dirname(__FILE__) . '/test_configs/test_config*/');
     foreach ($configPaths as $configPath) {
         // 1. Setup DB
         $this->executeSqlFile($configPath . 'db_setup/db_setup.sql');
         // 2. Generate
         // Which config to use?
         $schemaGeneratorConfigFile = $configPath . 'generator_config/database_schema_generator.inc.php';
         $coughGeneratorConfigFile = $configPath . 'generator_config/cough_generator.inc.php';
         // Get the database config
         $schemaGeneratorConfig = DatabaseSchemaGeneratorConfig::constructFromFile($schemaGeneratorConfigFile);
         // Load the schema into memory
         $schemaGenerator = new DatabaseSchemaGenerator($schemaGeneratorConfig);
         $schema = $schemaGenerator->generateSchema();
         // Manipulate the schema (to add any missed relationships, e.g.)
         $manipulator = new SchemaManipulator($schemaGeneratorConfig);
         $manipulator->manipulateSchema($schema);
         // Get the cough generator config
         $outputDir = $configPath . 'output/';
         include $coughGeneratorConfigFile;
         $coughGeneratorConfig = new CoughGeneratorConfig($config);
         // Generate files into memory
         $coughGenerator = new CoughGenerator($coughGeneratorConfig);
         $classes = $coughGenerator->generateCoughClasses($schema);
         // Write files to disk
         $coughWriter = new CoughWriter($coughGeneratorConfig);
         $this->assertTrue($coughWriter->writeClasses($classes), 'Unable to write classes to disk.');
         // 3. Perform comparison
         $diffCommand = 'diff -r ' . escapeshellarg($configPath . 'expected_output') . ' ' . escapeshellarg($configPath . 'output');
         $diffOutput = shell_exec($diffCommand);
         $message = "Generated output does not match; diff files using:\n" . $diffCommand . "\n\n" . "DIFF OUTPUT:\n" . "==============================================\n" . $diffOutput . "\n" . "==============================================\n\n";
         if (!empty($diffOutput)) {
             $message .= "<: " . substr_count($diffOutput, "\n<") . "\n";
             $message .= ">: " . substr_count($diffOutput, "\n>") . "\n\n";
         }
         $this->assertTrue(empty($diffOutput), $message);
         // 4. Clean up files
         if (empty($diffOutput)) {
             $this->removeGeneratedClasses($configPath . 'output/');
         }
         // 5. Clean up DB
         $this->executeSqlFile($configPath . 'db_setup/db_teardown.sql');
         $this->dropAllTables();
     }
 }
 protected function generateFromConfigPath($configPath)
 {
     try {
         if (!file_exists($configPath)) {
             echo 'Config path does not exist: ' . $configPath . "\n";
             return;
         }
         if (!is_dir($configPath)) {
             echo 'Config path is not a directory: ' . $configPath . "\n";
             return;
         }
         // Which config to use?
         $schemaGeneratorConfigFile = $configPath . 'database_schema_generator.inc.php';
         $coughGeneratorConfigFile = $configPath . 'cough_generator.inc.php';
         // Get the database config
         $schemaGeneratorConfig = DatabaseSchemaGeneratorConfig::constructFromFile($schemaGeneratorConfigFile);
         // Load the schema into memory
         $schemaGenerator = new DatabaseSchemaGenerator($schemaGeneratorConfig);
         if ($this->verbose) {
             $schemaGenerator->enableVerbose();
         }
         $schema = $schemaGenerator->generateSchema();
         // Dump some verbose messages.
         // echo "\n";
         // $schema->outputRelationshipCounts();
         // echo "\n" . 'About to run the SchemaManipulator and re-output the relationships.' . "\n";
         // Manipulate the schema (to add any missed relationships, e.g.)
         $manipulator = new SchemaManipulator($schemaGeneratorConfig);
         if ($this->verbose) {
             $manipulator->enableVerbose();
         }
         $manipulator->manipulateSchema($schema);
         // Dump some verbose messages again to see if the manipulator added anything.
         // echo "\n";
         // $schema->outputRelationshipCounts();
         // Get the cough generator config
         $coughGeneratorConfig = CoughGeneratorConfig::constructFromFile($coughGeneratorConfigFile);
         // Generate files into memory
         $coughGenerator = new CoughGenerator($coughGeneratorConfig);
         $classes = $coughGenerator->generateCoughClasses($schema);
         // Add some spacing if verbose mode is on
         if ($this->verbose) {
             echo "\n";
         }
         // Write files to disk
         $coughWriter = new CoughWriter($coughGeneratorConfig);
         if (!$coughWriter->writeClasses($classes)) {
             echo 'Trouble writing classes:' . "\n";
             echo '------------------------' . "\n";
             foreach ($coughWriter->getErrorMessages() as $message) {
                 echo $message . "\n";
             }
             echo "\n";
         } else {
             $lineCount = 0;
             foreach ($classes as $class) {
                 $lineCount += substr_count($class->getContents(), "\n");
             }
             echo 'Success writing ' . count($classes) . ' classes (' . number_format($lineCount) . ' lines) with ' . $schema->getNumberOfHasOneRelationships() . ' one-to-one relationships and ' . $schema->getNumberOfHasManyRelationships() . ' one-to-many relationships!' . "\n";
         }
         if ($this->verbose) {
             echo "\n" . 'PHP memory usage:' . "\n";
             echo number_format(memory_get_usage()) . " used\n";
             if (version_compare(phpversion(), '5.2.0', '>=')) {
                 echo number_format(memory_get_usage(true)) . " allocated\n";
             }
         }
     } catch (Exception $e) {
         echo $e->getMessage() . "\n";
     }
 }