#!/usr/bin/php $token ) { if ( is_array($token) && $token[0] != T_WHITESPACE ) { $temp[] = $tokens[$k]; } if ( !is_array($token)) { $temp[] = $token; } } $tokens = $temp; $className = ''; $comments = ''; $path = '/' . str_replace (ROOT_PATH, '', $file); $atLeastOneClass = false; foreach ( $tokens as $k => $token ) { if ( is_array($token) ) { //looking for classes if ( $token[0] == T_CLASS ) { if ( $atLeastOneClass ) { fprintf ( $fp, " } \n" ); } $atLeastOneClass = true; $className = nextToken( T_STRING, $k ); if (strpos(strtolower($entry), strtolower($className))) { print "--> $className\n"; } else { print "--> $className ($entry)\n"; } $classFile = $folder . '/' . $entry; if ( !is_dir($outputDir . $folder)) { mkdir($outputDir . $folder, 0777, true); } $fp = fopen ( $outputDir . $folder . '/class' . $className . 'Test.php', 'w'); fprintf ( $fp, "object = new %s();\n", $className); fprintf ( $fp, " }\n\n"); fprintf ( $fp, " /**\n" ); fprintf ( $fp, " * Tears down the fixture, for example, closes a network connection.\n" ); fprintf ( $fp, " * This method is called after a test is executed.\n" ); fprintf ( $fp, " */\n" ); fprintf ( $fp, " protected function tearDown()\n"); fprintf ( $fp, " {\n"); fprintf ( $fp, " }\n"); fprintf ( $fp, "\n"); $methods = get_class_methods($className); fprintf ( $fp, " /**\n" ); fprintf ( $fp, " * This is the default method to test, if the class still having \n" ); fprintf ( $fp, " * the same number of methods.\n" ); fprintf ( $fp, " */\n" ); fprintf ( $fp, " public function testNumberOfMethodsInThisClass()\n"); fprintf ( $fp, " {\n"); fprintf ( $fp, " \$methods = get_class_methods('%s');", $className ); fprintf ( $fp, " \$this->assertTrue( count(\$methods) == %s);\n", count($methods) ); fprintf ( $fp, " }\n"); fprintf ( $fp, "\n"); } if ( $token[0] == T_FUNCTION ) { $functionName = nextToken( T_STRING, $k ); $public = previousToken( T_PUBLIC, $k ); $comments = previousToken( T_DOC_COMMENT, $k ); parseFunction ( $k, $path, $className, $functionName, $comments); //if ( strtolower($public) == 'public' ) parsePublic ( $path, $className, $functionName, $comments ); } } } if ( $atLeastOneClass ) { fprintf ( $fp, " } \n" ); } } /* [GetCaseInfo] class = BpmnEngine_Services_Case path = /businessLogic/modules/bpmnEngine/Services/Case.php gearman = false rest = false background = false */ function parseFunction ( $k, $path, $className, $functionName, $comments ) { global $fp; global $tokens; if ( trim($className) == '' ) return; $comm = explode ("\n", $comments); $params = array(); //print " --> $functionName ( "; //search for first ( open parenthesis $openParenthesis = false; $closeParenthesis = false; while ( ! $openParenthesis ) { if (! is_array($tokens[$k]) && $tokens[$k] == '(' ) $openParenthesis = true; $k++; } while ( ! $closeParenthesis ) { if (is_array($tokens[$k]) && $tokens[$k][0] == T_VARIABLE ) { //print " " . $tokens[$k][1]; } if (! is_array($tokens[$k]) && $tokens[$k] == ')' ) { $closeParenthesis = true; //print " \n"; } $k++; } $methods = get_class_methods($className); if (!in_array($functionName, $methods ) ) { return; } fprintf ( $fp, " /**\n" ); fprintf ( $fp, " * @covers %s::%s\n", $className, $functionName ); fprintf ( $fp, " * @todo Implement test%s().\n", $functionName ); fprintf ( $fp, " */\n" ); fprintf ( $fp, " public function test%s()\n", $functionName ); fprintf ( $fp, " {\n" ); fprintf ( $fp, " \$methods = get_class_methods(\$this->object);\n"); fprintf ( $fp, " \$this->assertTrue( in_array('%s', \$methods ), 'exists method %s' );\n",$functionName,$functionName); fprintf ( $fp, " \$r = new ReflectionMethod('%s', '%s');\n", $className, $functionName ); fprintf ( $fp, " \$params = \$r->getParameters();\n"); $r = new ReflectionMethod($className, $functionName); $params = $r->getParameters(); foreach ( $params as $key=>$param) { fprintf ( $fp, " \$this->assertTrue( \$params[$key]->getName() == '%s');\n", $param->getName()); fprintf ( $fp, " \$this->assertTrue( \$params[$key]->isArray() == %s);\n", $param->isArray() == true ? 'true':'false'); fprintf ( $fp, " \$this->assertTrue( \$params[$key]->isOptional () == %s);\n", $param->isOptional() == true ? 'true':'false'); if ($param->isOptional()) { fprintf ( $fp, " \$this->assertTrue( \$params[$key]->getDefaultValue() == '%s');\n", $param->getDefaultValue() ); } } // fprintf ( $fp, " \$this->markTestIncomplete('This test has not been implemented yet.');\n\n"); fprintf ( $fp, " } \n\n" ); } function parsePublic ( $path, $className, $functionName, $comments ) { global $fp; $comm = explode ("\n", $comments); $gearman = false; $rest = false; $background = false; foreach ( $comm as $k => $line ) { $line = trim(str_replace('*','',$line)); if (substr($line,0, 13) == '@background =') $background = strtolower(trim(substr( $line,14 ))); if (substr($line,0, 10) == '@gearman =') $gearman = strtolower(trim(substr( $line,11 ))); if (substr($line,0, 7) == '@rest =') $rest = strtolower(trim(substr( $line,7 ))); } fprintf ( $fp, "[$functionName]\n class = $className\n path = $path\n" ); fprintf ( $fp, " gearman = " . ($gearman == 'true' ? 'true' : 'false') . "\n" ); fprintf ( $fp, " background = " . ($background== 'true' ? 'true' : 'false') . "\n" ); fprintf ( $fp, " rest = " . ($rest == 'true' ? 'true' : 'false') . "\n" ); fprintf ( $fp, "\n" ); } function nextToken( $type, $k ) { global $tokens; do { $k++; if ($tokens[$k][0] == T_FUNCTION || $tokens[$k][0] == T_CLASS ) { return ''; } } while ( $k < count($tokens) && $tokens[$k][0] != $type ); if ( isset($tokens[$k]) ) { return $tokens[$k][1]; } else { return ''; } } function previousToken( $type, $k ) { global $tokens; do { $k--; if ($tokens[$k][0] == T_FUNCTION || $tokens[$k][0] == T_CLASS ) { return ''; } } while ( $k > 0 && $tokens[$k][0] != $type ); if ( isset($tokens[$k]) ) { return $tokens[$k][1]; } else { return ''; } }