Index: review/client.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project_issue_file_review/review/client.inc,v
retrieving revision 1.23
diff -u -r1.23 client.inc
--- review/client.inc	17 Dec 2009 22:53:06 -0000	1.23
+++ review/client.inc	18 Dec 2009 01:28:11 -0000
@@ -96,6 +96,13 @@
   );
 
   /**
+   * Output of last command executed via exec().
+   *
+   * @var array
+   */
+  protected $output = array();
+
+  /**
    * Initialize the review environment.
    */
   public function __construct(array $test) {
@@ -621,10 +628,10 @@
     if ($capture_stderr) {
       $command .= ' 2>&1';
     }
-    exec($command, $output, $status);
+    exec($command, $this->output, $status);
 
     if ($status != 0) {
-      $output = trim(implode("\n", $output));
+      $output = trim(implode("\n", $this->output));
       self::$instance->log("Command [$command] failed with status [$status] and " .
         ($output ? "output:\n$output" : 'no output') . '.');
       return FALSE;
Index: review/simpletest/pifr_simpletest.client.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/project_issue_file_review/review/simpletest/pifr_simpletest.client.inc,v
retrieving revision 1.19
diff -u -r1.19 pifr_simpletest.client.inc
--- review/simpletest/pifr_simpletest.client.inc	17 Dec 2009 23:40:43 -0000	1.19
+++ review/simpletest/pifr_simpletest.client.inc	18 Dec 2009 01:28:11 -0000
@@ -75,6 +75,12 @@
       return;
     }
 
+    // Get test info for use by test_info_parse().
+    if (!$this->exec(PIFR_CLIENT_PHP . ' ./scripts/run-tests.sh --php ' . PIFR_CLIENT_PHP . ' --url ' . $url . ' --list')) {
+      $this->set_error(array('@reason' => t('failed attempting to get list of tests from run-tests.sh')));
+      return;
+    }
+
     chdir($this->original['directory']);
   }
 
@@ -141,6 +147,7 @@
       $result['data'] = array();
 
       // Cycle through assertions to fill in results.
+      $info = $this->test_info_parse();
       $assertions = $this->database->query('SELECT * FROM {simpletest}');
       $non_pass = 0;
       foreach ($assertions as $assertion) {
@@ -150,7 +157,7 @@
         // Initialize each test class.
         if (!isset($result['data'][$assertion['test_class']])) {
           $result['data'][$assertion['test_class']] = array(
-            'test_name' => $assertion['test_class'],
+            'test_name' => !empty($info[$assertion['test_class']]) ? $info[$assertion['test_class']] : $assertion['test_class'],
             'pass' => 0,
             'fail' => 0,
             'exception' => 0,
@@ -188,6 +195,28 @@
   }
 
   /**
+   * Parse test info from 'run-tests.sh --list' output.
+   *
+   * @return array Associative array of test info keyed by test case.
+   */
+  protected function test_info_parse() {
+    $this->output = array_slice($this->output, 4);
+    $group = 'Unknown';
+    $info = array();
+    foreach ($this->output as $line) {
+      if ($line[1] == '-') {
+        if (preg_match('/^ - (.*?) (\(\w+\))$/m', $line, $match)) {
+          $info[$match[2]] = $group . ': ' . $match[1] . ' (' . $match[2] . ')';
+        }
+      }
+      else {
+        $group = $line;
+      }
+    }
+    return $info;
+  }
+
+  /**
    * If on review operation then display the assertion count.
    */
   public static function status() {
